따옴표와 큰 따옴표 이스케이프


94

-param다음 명령 줄에서 값 의 따옴표를 올바르게 이스케이프하려면 어떻게해야 합니까?

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

물론 이것은 실패합니다. 이스케이프 문자`를 사용하여 따옴표 (싱글 및 더블)를 이스케이프하려고 시도하고 다양한 조합을 수행했지만 아무것도 작동하지 않습니다.



@PeterMortensen이 기사의 문제는 네이티브 응용 프로그램을 시작하고 큰 따옴표를 포함하는 매개 변수를 인수로 전달하려는 경우 더 나은 방법이없는 것 같습니다.
Andrew Savinykh

@Andrew Savinykh : 한 가지 방법은 대신 cmd를 통해 시작하는 것 $someCommandStringWithDoubleQuotes | cmd입니다. 이것은 실제로 PowerShell 스크립트에서 작동합니다 (예 : CMake 호출 (큰 따옴표가 필요하지 않음 (그렇지 않으면 자동으로 실패 함))). CMD의 대안은 bash.exe ( MinGW )이지만 일부 상황에서는 시작하는 것이 매우 느릴 수 있습니다.
Peter Mortensen 2019

답변:


59

이와 같은 이스케이프 매개 변수는 일반적으로 좌절감의 원인이며 시간을 낭비하는 것처럼 느껴집니다. v2를 사용하는 것으로 보이므로 Joel "Jaykul"Bennet 이 얼마 전에 블로그에 올린 기술을 사용하는 것이 좋습니다 .

간단히 말해서, 문자열을 @ '...'@로 감싸기 만하면됩니다.

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

( 어떤 따옴표가 필요한지, 그리고 어떤 것을 이스케이프하려고하는지 가정 했다는 점을 염두에 두십시오.) 출력 작업을하고 싶다면 -NoNewWindow스위치 를 추가 할 수 있습니다 .

BTW : 이것은 매우 중요한 문제 였기 때문에 v3 이후로 --%PowerShell 파서가 매개 변수로 어떤 작업을 수행하지 못하도록 할 수 있습니다 .

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

... (동일한 가정하에) 잘 작동합니다.


대답 해 주셔서 감사합니다. 내가 아무리 시도해도 시작 프로세스는 항상 불평했습니다. 그래서 나는 cmd / C $ cmd ($ cmd는 .exe를 포함한 전체 명령입니다.)를 수행했습니다. powershell 2.0을 사용하고 있습니다. 내가 올바르게 기억하면 here-string조차도 작동하지 않았습니다.
eetawil 2013-08-27

3
이것은 큰 따옴표를 이스케이프하기 위해 역 따옴표 (`)를 사용하는 것에 비해 불필요하게 복잡해 보입니다.
saille

6
예상하는 규칙을 따르는 한 잘 작동합니다. 첫 번째 @ '는 "line 1"에, 매개 변수는 "line 2"에, 끝'@은 "line 3"에 있어야합니다. 끝 '@ 앞에는 공백이있을 수 없습니다. 이 구문은 까다 롭습니다!
Ian Newland

잘 작동합니다! 문자열에서 변수를 확장해야하는 경우 @""@대신 사용할 수 있습니다 .
browly

97

백틱 (`)을 사용하면 다음 위치에 넣으면 잘 작동합니다.

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

$cmd 다음과 같이 반환됩니다.

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

그게 당신이 찾고 있던 것입니까?

PowerShell이 ​​제공 한 오류는 예기치 않은 토큰 'sort1'을 참조했으며, 이것이 제가 백틱을 넣을 위치를 결정한 방법입니다.

@ '...'@ 구문은 "here string"이라고하며 입력 한 내용을 정확하게 반환합니다. 이를 사용하여 다음과 같은 방식으로 변수를 채울 수도 있습니다.

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

여는 기호와 닫는 기호는 위에 표시된대로 자체 줄에 있어야합니다.


지연되어 죄송합니다. 제가 만든 방식은 마침내 powershell에서 cmd / C "MYCOMMAND"를 호출하는 것입니다. powershell을 직접 사용하면 작동하지 않았습니다.
eetawil 2013-08-27

1
그러나 호출 될 때 Invoke-Expression큰 따옴표를 제거 하지 $cmd않습니까? 아니면 사용 $cmd하지 않고 어떻게 사용 Invoke-Expression하셨습니까?
Peter Mortensen

8

나는 오늘 Node.js 모듈을 통해 명령을 실행하는 동안 비슷한 곤경에 처해 있음을 발견했습니다.

PowerShell을 사용하고 실행하려고했습니다.

command -e 'func($a)'

그러나 추가 기호를 사용하여 PowerShell은 인수를 조작했습니다. 수정하기 위해 이스케이프 된 큰 따옴표를 역틱으로 표시합니다.

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

2
흥미 롭다 : "['`"][^'`"]['`"]"작동하지만… '[`'"][^`'"][`'"]'그렇지 않다! 나를 미치게했다
David J
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.