如何在以下命令行中正确转义-param
值中的引号?
$cmd="\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'""
Invoke-Expression $cmd
这当然失败了。我试图使用转义字符`来逃避引号(单引号和双引号)并做了各种组合,但没有任何效果。
答案 0 :(得分:75)
如果我将它们放在以下位置,使用反引号(`)对我来说很好用:
$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'""
'@
开始和结束符号必须在各自的行上,如上所示。
答案 1 :(得分:50)
逃避这样的参数通常是令人沮丧的根源,感觉很像浪费时间。我看到你在v2上所以我建议使用Joel“Jaykul”Bennet blogged about a while ago的技术。
长话短说:你只需用@'...'包裹你的字符串@:
Start-Process \\server\toto.exe @'
-batch=B -param="sort1;parmtxt='Security ID=1234'"
'@
(请注意,我假设需要哪些引号,以及您试图逃脱的内容。)如果您想使用输出,可能需要添加-NoNewWindow
开关。
--%
阻止PowerShell解析器对你的参数做任何事情:
\\server\toto.exe --% -batch=b -param="sort1;paramtxt='Security ID=1234'"
......应该在那里工作正常(假设相同)。
答案 2 :(得分:8)
我在尝试通过Node.js模块运行命令时发现自己处于类似的困境:
我正在使用PowerShell并尝试运行:
command -e 'func($a)'
但是有了额外的符号,PowerShell正在破坏这些争论。为了解决这个问题,我回复了双重引号:
command -e `"func($a)`"
答案 3 :(得分:0)
在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}"