3

WshShellオブジェクトのExecメソッドを使用してPowershellを呼び出そうとしています。私はJScriptでスクリプトを書いていますが、VBScriptでも問題を再現しました。次の短いテストスクリプトはどちらも、WSHが無期限にハングする原因になります。

test.js

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

test.vbs

dim shell

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

私は何か間違ったことをしていますか、それとも制限/非互換性に遭遇していますか?Runメソッドは非常にうまく機能しますが、出力をキャプチャする必要がありますが、これは実行できません。

編集:私のプラットフォームがWindows 7 Pro、PowerShell3を搭載した64ビットであることを忘れました。PowerShell1を搭載したWindowsXPでもテストしました。

編集2:実行しているテストスクリプトをx0nの回答に合うように更新しました。残念ながら、私はまだ問題を抱えています。これが私の現在のテストです:

test.js:

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

test.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

StdInを閉じる必要があります:

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 に答える