2013-08-08 18 views
50

Tôi khá mới đối với Powershell ... và tôi đã tự hỏi làm cách nào tôi thoát đúng dấu ngoặc kép trong giá trị -param.Báo giá thoát và dấu ngoặc kép

$cmd="\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'"" 
Invoke-Expression $cmd 

Điều này tất nhiên không thành công, tôi đã cố gắng thoát khỏi dấu ngoặc đơn (đơn và kép) bằng cách sử dụng ký tự thoát và kết hợp khác nhau nhưng không có gì hoạt động. Hãy giúp

Trả lời

35

Các thông số thoát như vậy thường là nguồn gây thất vọng và cảm thấy rất nhiều thời gian lãng phí. Tôi thấy bạn đang ở trên v2 vì vậy tôi sẽ đề nghị sử dụng một kỹ thuật mà Joel "Jaykul" Bennet blogged about a while ago

dài truyện ngắn: bạn chỉ cần quấn bạn chuỗi với @ '...' @:

Start-Process \\server\toto.exe @' 
-batch=B -param="sort1;parmtxt='Security ID=1234'" 
'@ 

(lưu ý rằng tôi giả định cần báo giá nào và bạn muốn tìm cách nào để thoát) Nếu bạn muốn làm việc với đầu ra, bạn có thể muốn thêm -Không có công tắc mớiWindow.

BTW: đây là vấn đề rất quan trọng rằng kể từ v3 bạn có thể sử dụng để ngăn chặn --% PowerShell phân tích cú pháp từ làm bất cứ điều gì với các thông số của bạn:

\\server\toto.exe --% -batch=b -param="sort1;paramtxt='Security ID=1234'" 

... nên hoạt động tốt ở đó (với giả định giống nhau).

+0

Cảm ơn bạn đã trả lời. bắt đầu-quá trình không có vấn đề làm thế nào tôi đã cố gắng luôn luôn phàn nàn. Vì vậy, tôi đã làm cmd/C $ cmd (trong đó $ cmd là toàn bộ lệnh của tôi bao gồm cả .exe.). Tôi đang sử dụng PowerShell 2.0. Ngay cả chuỗi ở đây cũng không hoạt động nếu tôi nhớ chính xác. – eetawil

+0

Điều này có vẻ phức tạp không cần thiết so với sử dụng backtick (') để thoát khỏi dấu nháy kép. – saille

+4

Điều này hoạt động tuyệt vời miễn là bạn tuân theo các quy tắc mà nó mong đợi. Đầu tiên @ 'phải nằm trên "dòng 1", thông số của bạn phải nằm trên "dòng 2" và kết thúc' @ phải trên "dòng 3". Kết thúc '@ không thể có dấu cách trước đó. Man cú pháp này là cầu kỳ! –

47

Sử dụng backtick (`) hoạt động tốt đối với tôi nếu tôi đặt chúng ở các vị trí sau:

$cmd="\\server\toto.exe -batch=B -param=`"sort1;parmtxt='Security ID=1234'`"" 

$cmd lợi nhuận như:

\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'" 

Là những gì bạn đang tìm kiếm?

Lỗi Powershell đã cho tôi gọi một mã thông báo không mong muốn 'sort1', đó là cách tôi xác định vị trí đặt dấu gạch chéo ngược.

Cú pháp @ '...' @ được gọi là "chuỗi ở đây" và sẽ trả lại chính xác những gì được nhập. Bạn cũng có thể sử dụng chúng để điền các biến theo cách sau:

[email protected]' 
"\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'"" 
'@ 

Ký hiệu mở và đóng phải nằm trên dòng riêng của chúng như được hiển thị ở trên.

+0

Xin lỗi vì sự chậm trễ ... cách tôi làm cho nó hoạt động là cuối cùng gọi cmd/C "MYCOMMAND" từ PowerShell. Nó không hoạt động bằng cách sử dụng PowerShell trực tiếp. – eetawil

6

tôi tìm thấy bản thân mình trong một tình cảnh tương tự như hiện nay trong khi cố gắng để chạy một lệnh thông qua một mô-đun nodejs:

Tôi đã sử dụng PowerShell và cố gắng chạy:

command -e 'func($a)' 

Nhưng với những biểu tượng thêm, PowerShell đã mangling các đối số. Để khắc phục, tôi đánh dấu lại các dấu trích dẫn thoát kép:

command -e `"func($a)`" 

Tôi hy vọng điều này sẽ giúp ai đó.

+0

thú vị: '' '" [''"] [^' '"] [''"] "' '' hoạt động ... nhưng '' '' [' '"] [^'' "] [' '"] ''' 'thì không! đã khiến tôi phát điên –