Powershell脚本始终通过HTA返回0

Powershell脚本始终通过HTA返回0,powershell,vbscript,hta,Powershell,Vbscript,Hta,我正在尝试从我编写的PowerShell脚本中获取输出 test.ps1 Get进程 HTA中的VBScript编码如下: 子测试() cmd=“powershell.exe-noprofile-命令。\test.ps1;退出$LASTEXITCODE” Set shell=CreateObject(“WScript.shell”) Set executor=shell.Exec(cmd) 执行器。标准输入。关闭 MsgBox executor.StdOut.ReadAll 端接头 当我在命

我正在尝试从我编写的PowerShell脚本中获取输出

test.ps1

Get进程
HTA中的VBScript编码如下:

子测试()
cmd=“powershell.exe-noprofile-命令。\test.ps1;退出$LASTEXITCODE”
Set shell=CreateObject(“WScript.shell”)
Set executor=shell.Exec(cmd)
执行器。标准输入。关闭
MsgBox executor.StdOut.ReadAll
端接头
当我在命令行中尝试这个
cmd
字符串时,它工作得非常好。但是消息框总是出现空白


解决此问题的最佳方法是什么?

最有可能的方法是
test.ps1
不在VBScript运行的工作目录中,因此找不到它,因此不会执行它。如果VBScript和PowerShell脚本位于同一目录中,则最好从VBScript路径生成PowerShell脚本路径:

Set fso=CreateObject(“Scripting.FileSystemObject”)
dir=fso.GetParentFolderName(WScript.ScriptFullName)
psscript=fso.BuildPath(dir,“test.ps1”)
然后您可以像这样构建命令字符串:

cmd=“powershell.exe-NoProfile-File”“&psscript&”
附加的双引号用于处理路径中的空格。我还建议使用参数
-File
而不是复杂的
-Command“…;exit$LASTEXITCODE”


作为替代方案(如果您希望继续从当前工作目录运行PowerShell脚本),您还可以更改脚本中的目录:

Set fso=CreateObject(“Scripting.FileSystemObject”)
Set sh=CreateObject(“WScript.Shell”)
sh.CurrentDirectory=fso.GetParentFolderName(WScript.ScriptFullName)
...
cmd=“powershell.exe-NoProfile-File.\test.ps1”

编辑:HTA的运行时环境与常规VBScript不同。HTA引擎不提供
WScript
对象,因此
WScript.ScriptFullName
在HTA中不起作用。但是,您可以从文档位置确定脚本目录:

Set fso=CreateObject(“Scripting.FileSystemObject”)
dir=fso.GetParentFolderName(替换(document.location.href,“文件:///”,“”)
psscript=fso.BuildPath(dir,“test.ps1”)
如果要将路径分隔符规范化为反斜杠,可以这样做:

psscript=fso.BuildPath(替换(dir,“/”,“\”,“test.ps1”)
或者像这样:

psscript=fso.BuildPath(fso.GetFolder(dir.Path,“test.ps1”)

在这个问题中,讨论了相同的问题:

解决方案是将powershell脚本中的输出写入文本文件,然后在HTA中读取该文本文件中的输出并用MsgBox显示


也许这也是您的解决方案。

谢谢!但是现在它说WScript.ScriptFullName对象是必需的。因此,您没有使用
cscript.exe
WScript.exe
运行VBScript代码。您的VBScript运行时环境是什么?我正在通过HTA onClick=“Test()”javascript事件句柄运行VBScript,因此我用WScript.ScriptFullName解决了这个问题。缺少双引号,但仍然没有输出。请参阅更新的答案。请不要在提问时使用像这样的旧信息。