【问题标题】:Escaping quotes and double quotes转义引号和双引号
【发布时间】:2013-08-09 14:02:36
【问题描述】:

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

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

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

【问题讨论】:

  • @PeterMortensen 这篇文章有问题,当你想启动一个原生应用程序并传递一个包含双引号作为参数的参数时,似乎没有更好的方法
  • @Andrew Savinykh:一种方法是通过 cmd 启动它:$someCommandStringWithDoubleQuotes | cmd。这实际上适用于 PowerShell 脚本(例如调用 CMake(这确实需要双引号(否则它将默默地失败)))。 CMD 的替代方案是 bash.exe (MinGW) - 但在某些情况下启动可能非常非常缓慢。

标签: powershell-2.0


【解决方案1】:

像这样转义参数通常会让人感到沮丧,而且感觉很像是在浪费时间。我看到您使用的是 v2,所以我建议使用 Joel "Jaykul" Bennet blogged about a while ago 的技术。

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

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

...在那里应该可以正常工作(假设相同)。

【讨论】:

  • 感谢您的回答。 start-process 不管我怎么尝试总是抱怨。所以我做了 cmd /C $cmd (其中 $cmd 是我的整个命令,包括 .exe。)。我正在使用powershell 2.0。如果我没记错的话,即使是这里的字符串也不起作用。
  • 与使用反引号 (`) 转义双引号相比,这似乎不必要地复杂。
  • 只要您遵循它所期望的规则,它就可以很好地工作。第一个 @' 必须在“第 1 行”,您的参数必须在“第 2 行”,结尾的 '@ 必须在“第 3 行”。结尾的 '@ 前面不能有空格。伙计,这种语法很挑剔!
  • 效果很好!如果需要扩展字符串中的变量,可以改用@""@
【解决方案2】:

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

$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 是不行的。
  • 但是Invoke-Expression 在被调用时不会去掉$cmd 的双引号吗?或者你是怎么使用$cmd而不使用Invoke-Expression的?
【解决方案3】:

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

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

command -e 'func($a)'

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

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

【讨论】:

  • 有趣:"['`"][^'`"]['`"]" 有效……但'[`'"][^`'"][`'"]' 无效!快把我逼疯了
【解决方案4】:

在 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}"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-26
    • 2011-06-13
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多