3

我正在尝试使用 WshShell 对象的 Exec 方法调用 Powershell。我正在用 JScript 编写脚本,但我也在 VBScript 中重现了这个问题。以下两个简短的测试脚本都会导致 WSH 无限期挂起:

测试.js

var shell = new ActiveXObject("WScript.Shell");
WScript.Echo(shell.exec("powershell -Command $Host.Version; Exit").StdOut.ReadAll());

测试.vbs

dim shell

set shell = CreateObject("WScript.Shell")
WScript.Echo shell.exec("powershell -Command $Host.Version; Exit").StdOut.ReadAll

我做错了什么,还是遇到了限制/不兼容?Run 方法效果很好,但我需要捕获输出,这是它无法做到的。

编辑:我忘了提到我的平台是 Windows 7 Pro,64 位的 PowerShell 3。我也用 PowerShell 1 在 Windows XP 上进行了测试。

编辑 2:我已经更新了我正在运行的测试脚本以适应 x0n 的答案。不幸的是,我仍然有麻烦。这是我目前的测试:

测试.js:

var shell = new ActiveXObject("WScript.Shell");
WScript.Echo(shell.exec('powershell -noninteractive -noprofile -Command "& { echo Hello_World ; Exit }"').StdOut.ReadAll());

测试.vbs:

dim shell

set shell = CreateObject("WScript.Shell")
WScript.Echo shell.exec("powershell -noninteractive -noprofile -Command ""& { echo Hello_World ; Exit }""").StdOut.ReadAll
4

2 回答 2

6

你必须关闭标准输入:

var shell = new ActiveXObject("WScript.Shell");
var exec = shell.Exec('powershell -noninteractive -noprofile -Command "& { echo Hello_World ; Exit }"');
exec.StdIn.Close();
WScript.Echo(exec.StdOut.ReadAll());

微软说:

StdIn is still open so PowerShell is waiting for input. (This is an
"implementation consideration" that we're hoping to fix in V2. The
PowerShell executable gathers all input before processing.) So
objexec.StdIn.Close() needs to be added.
于 2012-11-22T18:13:25.997 回答
2

利用:

powershell.exe -noninteractive -noprofile -command $host.version

作为你的字符串。对于更复杂的命令组,请使用以下语法:

powershell.exe -noninteractive -noprofile -command "& { $host.version; $host.version }"
于 2012-09-04T22:52:03.717 回答