2012-09-04 400 views
3

我正嘗試使用WshShell對象的Exec方法調用Powershell。我正在用JScript編寫腳本,但我也在VBScript中重現了這個問題。下面兩個短的測試腳本會導致WSH無限期掛起:使用WshShell.Exec()方法調用Powershell掛起腳本

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,64位PowerShell 3.我已經在Windows XP上用PowerShell 1進行了測試。

編輯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 

回答

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()); 

Microsoft說:

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. 
+0

非常好,工作。謝謝。 – bshacklett

+1

您不必關閉StdIn。但是你需要使用'-NonInteractive'和'-Command'參數才能成功。但是我提出了你的答案,因爲關閉StdIn不會傷害,最終我得到了這個工作。感謝發佈! – fourpastmidnight

2

用途:

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

爲您的字符串。有關命令的更復雜的羣體,使用此語法:

powershell.exe -noninteractive -noprofile -command "& { $host.version; $host.version }" 
+0

我想你的建議,但遺憾的是它並沒有解決問題。我在wscript.exe中運行它,發現powershell窗口保持打開狀態,但它完全空白。關閉此窗口允許WSH腳本繼續執行。我在Windows 7和XP電腦上都測試了這個功能。 – bshacklett