如何從HTA 中啟動應用程序?
問:
您好,腳本專家!對於HTA,有沒有什麼可以替代Wscript.Shell 命令?我需要運行某個應用程序並指定要打開的文件。
-- DL
答:
您好,DL。是的,我們確實知道這樣的命令,可以在HTA 中使用並可以替代Wscript.Shell 命令,我們一會兒就會向您介紹。不過,在介紹它之前,我們應注意到您實際上可以在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 對象。還有其他您可以創建的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 對象時不會遇到此問題。