-param
다음 명령 줄에서 값 의 따옴표를 올바르게 이스케이프하려면 어떻게해야 합니까?
$cmd="\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'""
Invoke-Expression $cmd
물론 이것은 실패합니다. 이스케이프 문자`를 사용하여 따옴표 (싱글 및 더블)를 이스케이프하려고 시도하고 다양한 조합을 수행했지만 아무것도 작동하지 않습니다.
-param
다음 명령 줄에서 값 의 따옴표를 올바르게 이스케이프하려면 어떻게해야 합니까?
$cmd="\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'""
Invoke-Expression $cmd
물론 이것은 실패합니다. 이스케이프 문자`를 사용하여 따옴표 (싱글 및 더블)를 이스케이프하려고 시도하고 다양한 조합을 수행했지만 아무것도 작동하지 않습니다.
$someCommandStringWithDoubleQuotes | cmd
입니다. 이것은 실제로 PowerShell 스크립트에서 작동합니다 (예 : CMake 호출 (큰 따옴표가 필요하지 않음 (그렇지 않으면 자동으로 실패 함))). CMD의 대안은 bash.exe ( MinGW )이지만 일부 상황에서는 시작하는 것이 매우 느릴 수 있습니다.
답변:
이와 같은 이스케이프 매개 변수는 일반적으로 좌절감의 원인이며 시간을 낭비하는 것처럼 느껴집니다. 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="\\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'""
'@
여는 기호와 닫는 기호는 위에 표시된대로 자체 줄에 있어야합니다.
Invoke-Expression
큰 따옴표를 제거 하지 $cmd
않습니까? 아니면 사용 $cmd
하지 않고 어떻게 사용 Invoke-Expression
하셨습니까?