如何-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
这当然失败了。我尝试使用转义字符 ` 转义引号(单引号和双引号)并进行了各种组合,但没有任何效果。
如果我将它们放在以下位置,使用反引号 (`) 对我来说效果很好:
$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'""
'@
如上所示,开始和结束符号必须在自己的行上。
像这样逃避参数通常是令人沮丧的根源,感觉很像浪费时间。我看到你在 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'"
...应该在那里工作正常(具有相同的假设)。
我今天在尝试通过 Node.js 模块运行命令时发现自己陷入了类似的困境:
我正在使用 PowerShell 并尝试运行:
command -e 'func($a)'
但是有了额外的符号,PowerShell 正在破坏参数。为了解决这个问题,我反引号转义了双引号:
command -e `"func($a)`"
在 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}"