Khi PowerShell thấy một lệnh bắt đầu bằng một chuỗi, nó chỉ đánh giá chuỗi, nghĩa là, nó thường lặp lại nó trên màn hình, ví dụ:
PS> "Hello World"
Hello World
Nếu bạn muốn PowerShell diễn giải chuỗi dưới dạng tên lệnh thì hãy sử dụng toán tử cuộc gọi (&) như vậy:
PS> & 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe'
Sau đó, có lẽ bạn chỉ cần trích dẫn các cặp tham số / đối số có chứa khoảng trắng và / hoặc ký tự trích dẫn. Khi bạn gọi một tệp EXE như thế này với các đối số dòng lệnh phức tạp, thường rất hữu ích khi có một công cụ sẽ cho bạn thấy cách PowerShell gửi các đối số đến tệp EXE. Các PowerShell Cộng đồng Extensions có một công cụ như vậy. Nó được gọi là echoargs. Bạn chỉ cần thay thế tệp EXE bằng echoargs - để lại tất cả các đối số và nó sẽ cho bạn thấy tệp EXE sẽ nhận các đối số như thế nào, ví dụ:
PS> echoargs -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass
Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data>
Arg 2 is <Source=mysource;Integrated>
Arg 3 is <Security=false;User>
Arg 4 is <ID=sa;Pwd=sapass!;Database=mydb;>
Arg 5 is <-dest:dbfullsql=Data>
Arg 6 is <Source=.\mydestsource;Integrated>
Arg 7 is <Security=false;User>
Arg 8 is <ID=sa;Pwd=sapass!;Database=mydb; computername=10.10.10.10 username=administrator password=adminpass>
Sử dụng echoargs bạn có thể thử nghiệm cho đến khi bạn hiểu đúng, ví dụ:
PS> echoargs -verb:sync "-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;"
Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;>
Hóa ra tôi đã rất cố gắng trước đây để duy trì dấu ngoặc kép xung quanh chuỗi kết nối. Rõ ràng điều đó là không cần thiết bởi vì ngay cả cmd.exe cũng sẽ loại bỏ chúng.
BTW, ngả mũ với đội PowerShell. Chúng khá hữu ích trong việc chỉ cho tôi câu thần chú cụ thể của dấu ngoặc đơn & dấu ngoặc kép để có kết quả mong muốn - nếu bạn cần giữ nguyên dấu ngoặc kép bên trong. :-) Họ cũng nhận ra đây là một lĩnh vực đau đớn, nhưng họ bị thúc đẩy bởi số lượng người bị ảnh hưởng bởi một vấn đề cụ thể. Nếu đây là một lĩnh vực gây đau khổ cho bạn, thì vui lòng bỏ phiếu gửi lỗi PowerShell này .
Để biết thêm thông tin về cách phân tích cú pháp PowerShell, hãy xem loạt blog PowerShell hiệu quả của tôi - cụ thể là mục 10 - "Tìm hiểu các chế độ phân tích cú pháp PowerShell"
CẬP NHẬT 4/4/2012: Tình huống này trở nên dễ xử lý hơn trong PowerShell V3. Xem bài đăng trên blog này để biết chi tiết .