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'"""
有关详细信息,请参阅 。
我一直在开发需要隐藏控制台 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"
我也尝试了
我也尝试用绝对文件路径(“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'"""
有关详细信息,请参阅