在批处理文件发出的 powershell 命令中转义引号

Escaping quotes in powershell command issued by batch file

提问人:vertigo 提问时间:3/7/2021 更新时间:3/7/2021 访问量:107

问:

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

“C:\Program Files\OpenVPN\bin\openvpn-gui.exe” --连接 “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 批处理文件 转义 引号

评论

1赞 mklement0 3/7/2021
正确格式化您的帖子

答:

0赞 Compo 3/7/2021 #1

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

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

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

"%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()"

评论

0赞 vertigo 3/7/2021
谢谢!几个问题:为什么你不喜欢使用单引号,因为它们似乎简化了事情,为什么使用 -NoLogo?AFAICT 它只是在加载 powershell 时不显示一行,但我实际上并没有加载它,只是运行一个命令,而且我看不出任何一种方式有什么区别。另外,既然 -Command 显然是为我正在做的事情准备的,为什么即使没有它它也能工作,那么为什么它是否被使用很重要?