2012-01-18 19 views
11

Ai đó có thể giải thích kết quả này cho tôi không? Tôi đã lãng phí rất nhiều thời gian trong những năm cố gắng để nắm vững cú pháp PowerShell để gọi lệnh, nhưng điều này ... Tôi thậm chí không thể đoán được làm thế nào để có được kết quả này từ đầu vào.Cú pháp (&) của toán tử gọi PowerShell và dấu ngoặc kép

PS C:\Users\P> & echoargs " ""1"" 2 3 ""4 5 6"" 7 8 9" 
Arg 0 is < 1 2 3 4> 
Arg 1 is <5> 
Arg 2 is <6 7 8 9> 

Bueller?

+0

Đây có phải là echoargs bạn đang sử dụng không? http://weblogs.asp.net/jgalloway/archive/2006/01/27/436713.aspx – ravikanth

+0

Xem câu trả lời của Keith. Tôi đã cài đặt "thả công khai" của PSCX tuần trước. Tôi nghĩ anh ấy đã cập nhật nó kể từ đó. –

+0

Câu hỏi hay về btw. Cho thấy sự bất bình của đối số của Powershell. Nhưng nó không thực sự là về '&' như bạn thấy giống nhau khi bạn chỉ gọi echoargs. – manojlds

Trả lời

4

Dấu ngoặc tăng gấp đôi tăng gấp đôi bên trong chuỗi được trích dẫn kép là cách chèn dấu ngoặc kép. Phiên bản cập nhật của echoargs.exe thấy điều này rõ ràng hơn một chút vì nó cho bạn thấy những dòng lệnh sử dụng để gọi exe:

PS> echoargs " ""1"" 2 3 ""4 5 6"" 7 8 9" 
Arg 0 is < 1 2 3 4> 
Arg 1 is <5> 
Arg 2 is <6 7 8 9> 

Command line: 
"C:\...\Modules\Pscx\Apps\EchoArgs.exe" " "1" 2 3 "4 5 6" 7 8 9" 

Nếu bạn đi mà dòng lệnh (sau khi đã được phân tích bằng PowerShell) bạn nhận được cùng một kết quả trong CMD.exe:

CMD> EchoArgs.exe " "1" 2 3 "4 5 6" 7 8 9" 
Arg 0 is < 1 2 3 4> 
Arg 1 is <5> 
Arg 2 is <6 7 8 9> 

Command line: 
C:\...\Modules\Pscx\Apps\EchoArgs.exe " "1" 2 3 "4 5 6" 7 8 9" 

Vì sao .NET hoặc mã khởi động C++ phân tích cú pháp dòng lệnh như vậy, tôi không hoàn toàn chắc chắn. Điều này MSDN topic bao gồm nó một chút và nếu bạn nhìn vào các ví dụ ở dưới cùng của chủ đề, bạn sẽ thấy một số hành vi phân tích cú pháp kỳ lạ, ví dụ: a\\\b d"e f"g h cho a\\\b, de fgh.

2

Lưu ý rằng Powershell được biết đến với một số lỗi nặng khi nói đến qua các đối số cho các ứng dụng và trích dẫn những lập luận nói - http://connect.microsoft.com/PowerShell/feedback/details/376207/executing-commands-which-require-quotes-and-variables-is-practically-impossible

Đây là cách tôi hiểu nó như thế nào đang được (mis) phân tích:

Chuỗi là " ""1"" 2 3 ""4 5 6"" 7 8 9"

Vì lỗi này có dấu ngoặc kép kép, trở thành trích dẫn kép theo nghĩa đen, không bao giờ làm được.

Chuỗi sẽ như thế nào " '1' 2 3 '4 5 6' 7 8 9"

Vì vậy <space>1 2 3 4 trở thành một cuộc tranh cãi vì nó phần đầu tiên với phù hợp với dấu ngoặc kép và 4 xảy ra trước khi không gian tiếp theo. Sau đó, không gian, và do đó 5 trở thành đối số thứ hai. Sau đó, không gian, do đó, phần tiếp theo sẽ là một đối số riêng biệt. Ở đây một lần nữa, quy tắc tương tự như đối số đầu tiên, ngoại trừ rằng 6 xảy ra trước khi báo giá và không có khoảng trống và do đó 6 7 8 9 trở thành đối số tiếp theo.

Đường gạch dưới - Đối số Powershell chuyển sang ứng dụng bên ngoài là khá sai lầm.

+2

V3 cải thiện các cuộc gọi EXE với các đối số phức tạp, xem bài đăng trên blog này: http://rkeithhill.wordpress.com/2012/01/02/powershell-v3-ctp2-provides-better-argument-passing-to-exes/ –

Các vấn đề liên quan