转义引号和双引号

eet*_*wil 81 powershell-2.0

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

$cmd="\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'""
Invoke-Expression $cmd 
Run Code Online (Sandbox Code Playgroud)

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

小智 83

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

$cmd="\\server\toto.exe -batch=B -param=`"sort1;parmtxt='Security ID=1234'`""
Run Code Online (Sandbox Code Playgroud)

$cmd 返回为:

\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'"
Run Code Online (Sandbox Code Playgroud)

那是你在找什么?

PowerShell给我的错误提到了一个意外的令牌'sort1',这就是我如何确定反引号的位置.

@'...'@语法称为"here string",它将准确返回输入的内容.您还可以使用它们以下列方式填充变量:

$cmd=@'
"\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'""
'@
Run Code Online (Sandbox Code Playgroud)

打开和关闭符号必须在它们自己的行上,如上所示.


Bar*_*ekB 53

逃避这样的参数通常是令人沮丧的根源,感觉很像浪费时间.我看到你在v2上,所以我建议使用一种技术,Joel"Jaykul"Bennet 在不久前发表过博客.

长话短说:你只需用@'...'包裹你的字符串@:

Start-Process \\server\toto.exe @'
-batch=B -param="sort1;parmtxt='Security ID=1234'"
'@
Run Code Online (Sandbox Code Playgroud)

(请注意,我假设需要哪些引号,以及您试图逃脱哪些内容.)如果您想使用输出,可能需要添加-NoNewWindow开关.

顺便说一句:这是一个非常重要的问题,从v3开始,你可以--%用来阻止PowerShell解析器对你的参数做任何事情:

\\server\toto.exe --% -batch=b -param="sort1;paramtxt='Security ID=1234'"
Run Code Online (Sandbox Code Playgroud)

......应该在那里工作得很好(假设相同).

  • 只要您遵循预期的规则,这就很有效.第一个@'必须在"第1行",你的参数必须在"第2行"和结尾'@ must on"第3行".结尾'@在它之前不能有空格.这个语法很挑剔! (5认同)
  • 与使用反引号(`)来避免双引号相比,这似乎不必要地复杂化. (3认同)

小智 8

我试图通过Node.js模块运行命令时发现自己处于类似的困境:

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

command -e 'func($a)'
Run Code Online (Sandbox Code Playgroud)

但是使用额外的符号,PowerShell正在破坏这些论点.为了解决这个问题,我退回了双重引号:

command -e `"func($a)`"
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是:```"['`"][^'`"]['`"]"``` 有效......但是```'[`'"][^`'"][`'"]' ```没有!快把我逼疯了 (2认同)