Thoát dấu ngoặc kép và dấu ngoặc kép


94

Làm cách nào để thoát khỏi dấu ngoặc kép trong -paramgiá trị trong dòng lệnh sau đúng cách?

$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 các dấu ngoặc kép (đơn và kép) bằng cách sử dụng ký tự thoát 'và thực hiện nhiều cách kết hợp khác nhau, nhưng không có gì hoạt động.



@PeterMortensen có vấn đề với bài viết này, là có dường như không phải là một cách tốt hơn, khi bạn muốn khởi chạy một ứng dụng bản địa và vượt qua một tham số trong đó bao gồm một dấu nháy kép như một một cuộc tranh cãi
Andrew Savinykh

@ Andrew Savinykh: Một cách là để khởi động nó thông qua cmd thay vì: $someCommandStringWithDoubleQuotes | cmd. Điều này thực sự hoạt động từ các tập lệnh PowerShell (ví dụ như gọi CMake (yêu cầu dấu ngoặc kép (nếu không nó sẽ âm thầm không thành công))). Một thay thế cho CMD là bash.exe ( MinGW ) - nhưng nó có thể khởi động rất chậm trong một số trường hợp.
Peter Mortensen

Câu trả lời:


59

Việc bỏ qua các thông số như vậy thường gây ra sự thất vọng và cảm thấy rất lãng phí thời gian. Tôi thấy bạn đang sử dụng v2 vì vậy tôi sẽ đề xuất sử dụng một kỹ thuật mà Joel "Jaykul" Bennet đã viết blog cách đây một thời gian .

Câu chuyện ngắn: bạn chỉ cần quấn chuỗi của mình bằng @ '...' @:

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

(Xin lưu ý rằng tôi đã giả định rằng những dấu ngoặc kép nào là cần thiết và những điều bạn đang cố gắng thoát ra.) Nếu bạn muốn làm việc với đầu ra, bạn có thể muốn thêm công -NoNewWindowtắc.

BTW: đây là vấn đề quan trọng đến nỗi kể từ phiên bản 3, bạn có thể sử dụng --%để ngăn trình phân tích cú pháp PowerShell làm bất cứ điều gì với các tham số của bạn:

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

... sẽ hoạt động tốt ở đó (với cùng một giả định).


Cảm ơn câu trả lời của bạn. quá trình bắt đầu bất kể tôi đã cố gắng như thế nào vẫn luôn bị phàn nàn. 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ớ không nhầm.
eetawil

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

6
Điều này hoạt động tốt 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", tham số của bạn phải ở "dòng 2" và đuôi' @ phải ở "dòng 3". Phần cuối '@ không được có khoảng trắng trước nó. Người đàn ông cú pháp này là cầu kỳ!
Ian Newland,

Hoạt động tuyệt vời! Nếu bạn cần mở rộng các biến trong chuỗi của mình, bạn có thể sử dụng @""@thay thế.
nâu

97

Sử dụng backtick (`) phù hợp với tôi nếu tôi đặt chúng ở những vị trí sau:

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

$cmd trả về dưới dạng:

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

Có phải đó là thứ bạn tìm?

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

Cú pháp @ '...' @ được gọi là "here string" và sẽ trả về 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:

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

Các ký hiệu đóng mở phải nằm trên dòng riêng của chúng như hình trên.


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

1
Nhưng không Invoke-Expressionloại bỏ các dấu ngoặc kép từ $cmdkhi nó được gọi? Hoặc bạn đã sử dụng như thế nào $cmdmà không sử dụng Invoke-Expression?
Peter Mortensen

8

Hôm nay tôi thấy mình ở trong tình trạng tương tự khi cố gắng chạy một lệnh thông qua mô-đun Node.js:

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

command -e 'func($a)'

Nhưng với các ký hiệu bổ sung, PowerShell đã làm xáo trộn các đối số. Để khắc phục, tôi đánh dấu lại các dấu ngoặc kép đã thoát:

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

2
thú vị: "['`"][^'`"]['`"]"hoạt động… nhưng '[`'"][^`'"][`'"]'không! đang lái xe cho tôi điên
David J
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.