2012-03-23 108 views
0

無論我做什麼,我都無法使它工作。即使我在BAT文件中刪除「msg/server:」語法並從Shell.Run中調用它,它仍然會說「'msg'不被識別爲內部或外部命令,可操作程序或批處理文件。」通過Wscript.Shell從HTA調用MSG.exe運行

我也試過「msg.exe」和「c:\ windows \ system32 \ msg.exe」。所有表單都可以從CMD控制檯直接輸入以及VBScript或CMD/BAT腳本中正常工作,但不能從HTA中正常工作。這是一個「按設計」的安全功能嗎?有沒有辦法解決?

+0

請張貼應該調用CMD的代碼。 – Teemu 2012-03-23 21:52:52

回答

0

爲了向後兼容,64位Windows附帶MSHTA.exe的兩個版本:

C:\Windows\SysWOW64\mshta.exe and 
    C:\Windows\System32\mshta.exe 

您所描述的行爲是對64位MSHTA.exe的珍品之一,它不能調用MSG.exe等32位應用程序。請注意,c:\ windows \ SysWOW64 \ cmd.exe中的64位命令提示符也將無法找到MSG.exe。

要解決這個問題,您可以將文件關聯名.hta與32位MSHTA.exe,或創建一個簡單的批處理文件來啓動你的HTA,START_MSG.cmd:

START C:\Windows\System32\mshta.exe C:\YOUR_PATH\MSG.hta 

我已經用64位和32位版本的MSHTA.exe測試了HTA。 64位版本引發「找不到文件」錯誤,但32位版本起作用。

<script language="Javascript"> 
var E, LineWriteTimerID 
function execWithStatus(cmdLine){ 
    E = new ActiveXObject("WScript.Shell").Exec(cmdLine); 
    LineWriteTimerID = window.setInterval("writeOutLine()",100); 
    E.StdIn.Close(); 
} 
function writeOutLine(){ 
    if(E.StdOut.AtEndOfStream) window.clearTimeout(LineWriteTimerID); 
    if(!E.StdErr.AtEndOfStream) txtResults.value += "ERROR: " + E.StdErr.ReadAll() + "\n"; 
    if(!E.StdOut.AtEndOfStream) txtResults.value += E.StdOut.ReadLine() + "\n"; 
} 
</script> 
<textarea id=txtCmd style="width:90%" rows=1>MSG.exe</textarea> 
<button onclick="execWithStatus(txtCmd.value)">Run</button> 
<br><textarea id=txtResults style="width:100%" rows=20></textarea> 
相關問題