转义引号和双引号


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(确实需要双引号(否则它将默默地失败)))。Bash.exe(MinGW)是CMD的替代方法-但是在某些情况下启动它可能非常非常慢。
彼得·莫滕森

Answers:


59

像这样转义参数通常是令人沮丧的原因,并且感觉很浪费时间。我看到您使用的是v2,所以我建议您使用Joel“ Jaykul” Bennet 不久前写的博客

长话短说:您只需用@'...'@来包装字符串:

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

(请记住,我假设需要用引号,而要尝试转义的内容。)如果要使用输出,则可能需要添加-NoNewWindow开关。

顺便说一句:这是一个非常重要的问题,从v3开始,您可以使用它--%来阻止PowerShell解析器对参数执行任何操作:

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

...应该在那里工作(假设相同)。


谢谢您的回答。启动过程无论我怎么尝试总是会抱怨。所以我做了cmd / C $ cmd(其中$ cmd是我的整个命令,包括.exe)。我正在使用Powershell 2.0。如果我没记错的话,即使这里的字符串也不起作用。
eetawil 2013年

3
与使用反引号(`)转义双引号相比,这似乎不必要地复杂。
saille 2014年

6
只要您遵守预期的规则,此方法就很好用。第一个@'必须在“第1行”上,您的参数必须在“第2行”上,而结尾的“ @”必须在“第3行”上。结束符'@之前不能有空格。伙计,这种语法很挑剔!
伊恩·纽兰德

很棒!如果需要在字符串中扩展变量,则可以使用@""@代替。
凌晨

96

如果将反引号(`)放在以下位置,则对我来说效果很好:

$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',这就是我确定放置反引号的位置。

@'...'@语法称为“此处字符串”,将完全返回输入的内容。您还可以使用它们以以下方式填充变量:

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

如上所示,打开和关闭符号必须位于自己的行上。


抱歉,延迟...我使之起作用的方法是最终从powershell调用cmd / C“ MYCOMMAND”。直接使用powershell无法正常工作。
eetawil 2013年

1
但是,是否不会Invoke-Expression$cmd调用双引号时将其删除?还是$cmd不使用就如何使用Invoke-Expression
彼得·莫滕森

8

今天,当我尝试通过Node.js模块运行命令时,我陷入了类似的困境:

我正在使用PowerShell并尝试运行:

command -e 'func($a)'

但是有了额外的符号,PowerShell正在处理参数。要解决此问题,我反选了转义的双引号:

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

2
有趣:"['`"][^'`"]['`"]"有效……但'[`'"][^`'"][`'"]'无效!令我发疯
David J
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.