【问题标题】:Powershell via VBScript - Environmental Variable path terminated when username contains spaces [duplicate]Powershell通过VBScript - 当用户名包含空格时环境变量路径终止[重复]
【发布时间】:2021-08-27 14:05:10
【问题描述】:

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

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" 或 "$env:username"

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

“%localappdata%”或“C:\Users\%username%\AppData\Local”

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

我还尝试将 %localappdata% 替换为绝对文件路径(“C:\Users\TEST USER 1\AppData\Local\test\test.ps1”),但这也会产生同样的错误。

任何帮助将不胜感激!提前致谢。

【问题讨论】:

  • 第一个是 VBScript 编码文件路径的正确方法 - command = "powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -command ""%localappdata%\test\test.ps1"""。但是,这并不意味着 Powershell 会对它感到满意,并且可能会期待其他东西。最好的测试是将 VBScript 排除在外,然后在命令提示符下运行 powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -command "%localappdata%\test\test.ps1",结果如何?
  • 在尝试了您的建议后,我似乎找到了解决方案 - 使用 "-File" 而不是 "-command" 似乎可以毫无问题地运行命令:command = "powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -File ""%localappdata%\test\test.ps1""" 非常感谢您的建议!
  • duplicate explains it 的详细程度足以让您解决问题。

标签: powershell vbscript


【解决方案1】:

由于您是通过路径调用脚本文件而不是将PowerShell语句传递给PowerShell's CLI使用@ 987654324@ 参数,而不是-Command,它隐式解决了您的引用问题:

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

-Command 在您的情况下不起作用的原因是它的参数需要另一轮解释,即作为 PowerShell 代码,在剥离句法 @ 之后987654328@ chars. 在命令行解析期间。这意味着 PowerShell 会看到带有空格的路径 unquoted,从而导致调用失败;您需要额外的引用 - 转义 " 引号(\"...\",即来自 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'"""

请参阅this answer 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-29
    • 2010-12-26
    • 2011-05-19
    • 2020-08-26
    • 1970-01-01
    • 2013-07-26
    相关资源
    最近更新 更多