嗨,Scripting Guy!

嗨,Scripting Guy!

歡迎蒞臨 TechNet 專欄,Microsoft Scripting Guys 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

還有,別忘了瞧瞧全新經過改良的嗨,Scripting Guy!過往文件

今天的問題:HTA 有其他可以取代 Wscript.Shell 命令的方法嗎?我需要執行應用程式,並指定要開啟的檔案。


要如何從 HTA 啟動應用程式?

嗨,Scripting Guy!HTA 有其他可以取代 Wscript.Shell 命令的方法嗎?我需要執行應用程式,並指定要開啟的檔案。

-- DL

DL,您好。有的,我們確實知道可取代 Wscript.Shell 命令的方法,能在 HTA 中運作,請稍待,我們馬上就告訴您。但是在這之前,應該告訴您的是,其實您可以在 HTA 之中,使用 Wscript.Shell 物件。這點經常使一般人困惑:由於不能在 HTA 之中使用某些命令 (例如 Wscript.Echo 和 Wscript.Sleep),一般人就認定不能在 HTA 中使用任何 WSH 命令。

我們就先釐清這些情況:為什麼不能在 HTA 中使用 Wscript.Echo 和 Wscript.Sleep 呢?因為這兩種方法都是 Wscript 物件的屬性,所以您不能建立 Wscript 物件的執行個體。Wscript 物件反而會自動建立,而且只有在執行 Windows Script Host (也就是Wscript.exe 或 Cscript.exe) 時,才會建立。因此下列指令碼完全有效:

Wscript.Echo "Hey."

請注意,我們並沒有建立 Wscript 物件,而是在呼叫 Windows Script Host 時,自動為我們建立了 Wscript 物件。

但這種情形只適用於 Wscript 物件。您還可以建立其他的 WSH 物件,其中包括 Shell 物件。例如,下列簡單的小 HTA 就能建立 Wscript.Shell 物件,然後執行 Notepad.exe (在執行過程中開啟檔案 C:\Scripts\Test.txt):

<html> 
<head> 
<script language="VBScript"> 
    Sub RunProgram 
        Set objShell = CreateObject("Wscript.Shell")
        objShell.Run "notepad.exe c:\scripts\test.txt"
    End Sub
</script> 
</head> 
<body> 
<button onclick="RunProgram">Run Program</button> <p>
</body> 
</html>

您可以看到,這大概是最簡單的 HTA 了:其中只包含一個按鈕,按下以後,會執行稱為 RunProgram 的副程式。請檢視一下 RunProgram 的程式碼:

Sub RunProgram 
    Set objShell = CreateObject("Wscript.Shell")
    objShell.Run "notepad.exe c:\scripts\test.txt"
End Sub

就是這樣:我們建立了 Wscript.Shell 物件的執行個體,然後呼叫 Run 方法。在這種手法中,我們傳給 Run 一個參數:可執行檔名稱 (notepad.exe),隨後跟著到我們所要開啟檔案的路徑。這是我們唯一需要執行的步驟。

順帶一提,只要在 HTA 中執行這個步驟,一切都會順利運作。但如果嘗試在 HTML 檔案 (也就是副檔名為 .htm 的檔案) 中執行,就會顯示一個訊息方塊,警告您有 ActiveX 控制項嘗試要在頁面上執行。此時必須按一下 [是],允許副程式建立 Shell 物件,然後再繼續執行。這是由於 WSH 物件被視為「對指令碼處理來說是不安全的」。

 

附註:是的,這聽起來確實有點奇怪,指令碼處理物件在指令碼處理上被視為不安全?那是因為 Internet Explorer 所使用的指令碼裝載和安全性模型都與 WSH 不同。不過幸好 HTA 所使用的安全性模型與 Internet Explorer 不同,也就是說,您在 HTA 之中建立 Shell 物件時,並不會碰到這種問題。


那,其他的替代方法呢?好,如果您因為某些原因,不要使用 Wscript.Shell 物件,那麼就可以改用 Windows Shell 物件。這種 HTA 也可以啟動記事本,然後開啟檔案 C:\Scripts\Test.txt:

<html> 
<head> 
<script language="VBScript"> 

Sub RunProgram Const NORMAL_WINDOW = 1 Set objShell = CreateObject("Shell.Application") objShell.ShellExecute "notepad.exe", "c:\scripts\test.txt", , , NORMAL_WINDOW End Sub

</script> </head>

<body> <button onclick="RunProgram">Run Program</button> <p> </body> </html>

不過老實說,我們實在看不出來使用 Windows Shell 物件跟使用 Wscript.Shell 物件相比,有任何明顯的優勢:兩種物件都能執行相同的作業。但是,如果您想再深入探索 Windows Shell,請參閱有關 ShellExecute (英文) 方法的說明文件。重點就是:如果想從 HTA 啟動應用程式,兩種方法都可行。


如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首