【发布时间】: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”
我也尝试了here和here提供的各种解决方案,但在这种情况下没有任何效果。
我还尝试将 %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