Powershell via VBScript - 当用户名包含空格时环境变量路径终止

Powershell via VBScript - Environmental Variable path terminated when username contains spaces

我一直在开发需要隐藏控制台 window 的 Powershell Winforms 应用程序。为此,我从 .vbs 文件调用 .ps1 脚本(通过另一个 .ps1 脚本开始并使用“-WindowStyle Hidden”仍然简要显示控制台 window打开脚本)。我正在使用以下代码:

Dim shell,command
command = "powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -command ""%localappdata%\test\test.ps1"""
Set shell = CreateObject("WScript.Shell")
shell.Run command,0

这在使用不带空格的帐户名时没有问题(例如,“TESTUSER”将解析为“C:\USERS\TESTUSER\AppData\Local”)。但是,当“%localappdata%”环境变量生成的路径的任何部分包含空格时(在本例中,使用类似“TEST USER 1”的内容),Powershell 将在“C:\Users\TEST”处终止命令错误提示:“术语“C:\Users\TEST”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。”

我知道 VBScript 中任何带空格的字符串都需要使用两组双引号(““带空格的路径””),但这在这种情况下不起作用 - 我已经尝试了所有组合已被建议,%localappdata% 路径仍然存在同样的问题。

我尝试过的东西:

两个引号包围路径(不带空格):

command = "powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -command ""%localappdata%\test\test.ps1"""

两个引号包围整个论点:

command = ""powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -command ""%localappdata%\test\test.ps1""""

两个单引号:

command = "powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -command "%localappdata%\test\test.ps1""

正在扩展 %localappdata% 变量:

Dim shell,path,command
Set shell.CreateObject("WScript.Shell")
path = shell.ExpandEnvironmentStrings("%localappdata%")
command = "powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -command " & path &"\test\test.ps1"
shell.Run command,0

添加“Chr(34)”替换空格:

command = "powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -command ""%localappdata%\test\test.ps1""" & Chr(34)

使用:

"$env:localappdata" or "$env:username"

(“命令”引号内外)替换

"%localappdata%" or "C:\Users\%username%\AppData\Local"

我也尝试了 and here 提供的各种解决方案,但在这种情况下没有任何效果。

我也尝试用绝对文件路径(“C:\Users\TEST USER 1\AppData\Local\test\test.ps1”)替换 %localappdata%,但这也给出了同样的错误。

如有任何帮助,我们将不胜感激!提前致谢。

因为您是通过路径调用脚本文件,而不是传递PowerShell语句 PowerShell's CLI使用-File参数,而不是-Command,这隐含地解决了你的引用问题:

' Note the use of -File instead of -Command
command = "powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -File ""%localappdata%\test\test.ps1"""

-Command 在您的案例中不起作用的原因是它的参数需要另一轮解释,即作为 PowerShell 代码, 在命令行解析期间剥离语法 " 个字符后。。这意味着随后 PowerShell 会 unquoted 看到带有空格的路径,从而导致调用失败;您需要额外的引号 - escaped " 引号(\"...\",即 VBScript 字符串中的 \""...\"")或单引号('...'), 这又需要使用 &, call operator:

' With -Command: note the embedded '...' quoting and the need to call with `&`
' However, there's usually no need for -Command to invoke scripts with arguments.
command = "powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -Command ""& '%localappdata%\test\test.ps1'"""

有关详细信息,请参阅