99

如何-param在以下命令行中正确转义值中的引号?

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

这当然失败了。我尝试使用转义字符 ` 转义引号(单引号和双引号)并进行了各种组合,但没有任何效果。

4

4 回答 4

104

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

$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'""
'@

如上所示,开始和结束符号必须在自己的行上。

于 2013-08-19T12:16:05.170 回答
60

像这样逃避参数通常是令人沮丧的根源,感觉很像浪费时间。我看到你在 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'"

...应该在那里工作正常(具有相同的假设)。

于 2013-08-08T07:18:45.433 回答
9

我今天在尝试通过 Node.js 模块运行命令时发现自己陷入了类似的困境:

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

command -e 'func($a)'

但是有了额外的符号,PowerShell 正在破坏参数。为了解决这个问题,我反引号转义了双引号:

command -e `"func($a)`"
于 2014-01-15T03:20:16.750 回答
1

在 Powershell 5 中,转义双引号可以通过反引号 (`) 来完成。但有时您需要提供转义的双引号,这可以通过反斜杠 + 反引号 (\`) 来完成。例如在这个 curl 调用中:

C:\Windows\System32\curl.exe -s -k -H "Content-Type: application/json" -XPOST localhost:9200/index_name/inded_type -d"{\`"velocity\`":3.14}"
于 2020-12-08T09:33:08.363 回答