如何從 HTA 中啟動應(yīng)用程序?
問:
您好,腳本專家!對于 HTA,有沒有什么可以替代 Wscript.Shell 命令?我需要運(yùn)行某個(gè)應(yīng)用程序并指定要打開的文件。
-- DL
答:
您好,DL。是的,我們確實(shí)知道這樣的命令,可以在 HTA 中使用并可以替代 Wscript.Shell 命令,我們一會兒就會向您介紹。不過,在介紹它之前,我們應(yīng)注意到您實(shí)際上可以在 HTA 中使用 Wscript.Shell 對象。這是一個(gè)常會引發(fā)混淆之處:因?yàn)槟?HTA 中無法使用某些命令(如 Wscript.Echo 和 Wscript.Sleep),人們就認(rèn)為您在 HTA 中無法使用任何 WSH 命令。
繼續(xù)之前,還有一個(gè)問題:為什么您在 HTA 中無法使用 Wscript.Echo 和 Wscript.Sleep 呢?是這樣,這些方法是 Wscript 對象的屬性,而您是無法創(chuàng)建 Wscript 對象實(shí)例。Wscript 對象是自動創(chuàng)建的,而且只有在您運(yùn)行 Windows Script Host(即 Wscript.exe 或 Cscript.exe)時(shí)才會創(chuàng)建。正因?yàn)檫@一點(diǎn),才可以說以下腳本絕對有效:
代碼如下:
Wscript.Echo "Hey."
請注意,我們沒有創(chuàng)建 Wscript 對象,該對象是在我們調(diào)用 Windows Script Host 時(shí)自動創(chuàng)建的。
但這只限于 Wscript 對象。還有其他您可以創(chuàng)建的 WSH 對象,包括 Shell 對象。例如,下面是一個(gè)簡單的小 HTA,它創(chuàng)建 Wscript.Shell 對象,然后運(yùn)行 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:它只由一個(gè)按鈕組成,單擊時(shí)會運(yùn)行名為 RunProgram 的子例程。請看一下 RunProgram 的代碼:
代碼如下:
Sub RunProgram
Set objShell = CreateObject("Wscript.Shell")
objShell.Run "notepad.exe c:\scripts\test.txt"
End Sub
就是這樣:我們創(chuàng)建 Wscript.Shell 對象的一個(gè)實(shí)例,然后調(diào)用 Run 方法。這樣就為 Run 傳遞了單一參數(shù):可執(zhí)行文件名 (notepad.exe) 后跟想要打開的文件的路徑。這就是我們需要做的一切。
順便說一句,只要是在 HTA 中運(yùn)行該腳本,則不會有任何問題。如果嘗試在 HTML 文件(即文件擴(kuò)展名為 .htm 的文件)中運(yùn)行它,則會顯示一個(gè)消息框,警告您有一個(gè) ActiveX 控件正在嘗試于頁面上運(yùn)行。此時(shí)必須單擊是以允許該子例程創(chuàng)建 Shell 對象,并隨后運(yùn)行它。這是因?yàn)?WSH 對象被認(rèn)為“對腳本編寫是不安全的”。
注意:是啊,這聽起來有點(diǎn)怪,竟然認(rèn)為腳本編寫對象對腳本編寫是不安全的。但這是因?yàn)?Internet Explorer 使用與 WSH 不同的腳本宿主和不同的安全模型。幸好 HTA 使用與 Internet Explorer 不同的安全模型,這意味著您在 HTA 內(nèi)創(chuàng)建 Shell 對象時(shí)不會遇到此問題。
那么,如果是使用那個(gè)替代命令呢?嗯,如果出于某種原因您不想使用 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>
坦白地講,我們認(rèn)為使用 Windows Shell 對象與使用 Wscript.Shell 對象相比并沒有什么真正的優(yōu)勢:這兩個(gè)對象的功能基本上一樣。不過,如果您想要擺弄一下 Windows Shell,請查閱有關(guān) ShellExecute 方法的文檔。重要的是這一點(diǎn):如果想要從 HTA 啟動應(yīng)用程序,兩種方法都可以使用。
更多信息請查看IT技術(shù)專欄