【问题标题】:Escaping quotes in powershell command issued by batch file在批处理文件发出的powershell命令中转义引号
【发布时间】:2021-06-05 07:02:11
【问题描述】:

我一直在尝试使用 PowerShell 命令来创建在批处理文件中工作的快捷方式,但无法将我需要的引号实际放入快捷方式中。我在其他批处理文件中使用过这个命令就好了,但是引号把它搞砸了。我试过“”、“””、“””、“、", \”、`”,几乎所有我能想到的变体都没有奏效。我需要这样的快捷方式:

"C:\Program Files\OpenVPN\bin\openvpn-gui.exe" --connect "mullvad.ovpn"

这就是我一直在尝试的,当然还有很多变化:

powershell "$s=(New-Object -COM WScript.Shell).CreateShortcut('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\OpenVPN GUI.lnk');$s.TargetPath= '"C:\Program Files\OpenVPN\bin\openvpn-gui.exe" --connect "mullvad.ovpn"';$s.Save()"

但它要么只是为此创建了一个快捷方式:

"C:\Program Files\OpenVPN\bin\openvpn-gui.exe --connect mullvad_us_chi.ovpn"

或者,更常见的是,由于我的各种尝试的语法错误,它会出错。那么如何让 PowerShell 在这里做我想做的事呢?

【问题讨论】:

标签: powershell batch-file escaping quotes


【解决方案1】:

您的主要问题是您没有正确创建快捷方式。

为此,您首先应使用附加属性。你的TargetPath 应该是可执行文件,其余的应该是它的Arguments

那么你的命令应该看起来更像这样:

"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NoProfile -Command "$s = (New-Object -COM WScript.Shell).CreateShortcut(\"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\OpenVPN GUI.lnk\");$s.TargetPath=\"C:\Program Files\OpenVPN\bin\openvpn-gui.exe\";$s.Arguments=\"--connect `\"mullvad.ovpn`\"\";$s.Save()"

我很少使用单引号,但如果您更喜欢单引号,那么也许这也适合您:

"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NoProfile -Command "$s = (New-Object -COM WScript.Shell).CreateShortcut('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\OpenVPN GUI.lnk');$s.TargetPath='C:\Program Files\OpenVPN\bin\openvpn-gui.exe';$s.Arguments='--connect \"mullvad.ovpn\"';$s.Save()"

【讨论】:

  • 谢谢!几个问题:为什么你不喜欢使用单引号,因为它们似乎可以简化事情,为什么使用 -NoLogo? AFAICT它只是在加载powershell时不显示一行,但我实际上并没有加载它,只是运行一个命令,我看不出有什么不同。另外,既然 -Command 显然是为我正在做的事情而设计的,为什么即使没有它它也能工作,那么它是否被使用又有什么关系呢?
猜你喜欢
  • 2020-09-10
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 2014-01-24
相关资源
最近更新 更多