問:
您好,指令碼專家!如果未運行其他執行個體,如何重新啟動 Internet Explorer?
-- MT
答:
您好,MT。多謝您的問題。您知道,如今每個人都在挑剔可憐的 Internet Explorer 的毛病(儘管大多數 Windows 使用者仍在使用 Internet Explorer)。但現在有人提出了一個問題,他想確保 Internet Explorer 始終正常運行。看見了吧,Internet Explorer:還有人喜歡你!
儘管我們本來要為 Internet Explorer 而感到高興的,但我們不得不承認這個問題使我們有些為難。畢竟,可通過多種不同的方法來解決此問題,這取決於您是需要立即重新啟動 Internet Explorer 還是要等一會再啟動它。對此問題沉思片刻之後,我們決定按我們通常所採取的辦法去做:採用最簡單的解決辦法,在本樣本中,每 60 秒檢查一次是否有任何 Internet Explorer 執行個體正在運行。如果有,則指令碼只返回到休眠狀態,再等待 60 秒,然後重新檢查。如果沒有任何啟動並執行 Internet Explorer 執行個體,則指令碼將啟動 Internet Explorer 的新副本,然後休眠片刻,再等待 60 秒,之後重新檢查。
是的,這有點類似於指令碼專家一天的工作。嗯,您知道我們是什麼意思嗎?不同之處就是每 60 秒即醒來一次以便幹點什麼。
以下是我們所提供的指令碼:
複製代碼 代碼如下:strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objShell = CreateObject("Wscript.Shell")
Do While True
Set colProcesses = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = 'iexplore.exe'")
If colProcesses.Count = 0 Then
objShell.Run "iexplore.exe"
End If
Wscript.Sleep 60000
Loop
沒錯:它實質上只是個普通的 WMI 指令碼。因此,它首先串連到本機電腦上的 WMI 服務。但是該指令碼與其他 WMI 指令碼之間存在一個主要的不同之處。通常此時我們會說:“不過,您也可以針對遠端電腦運行此指令碼”。遺憾的是,這一次並非如此。從技術上講,您可以針對遠端電腦運行該指令碼,但您啟動的任何 Internet Explorer 執行個體都將在不可見的視窗中運行(至少在 Windows XP 和 Windows Server 2003 上是這樣),因此,您將無法在螢幕上看到它。這是作業系統中內建的一種安全功能:遠程啟動的進程始終在隱藏視窗中運行。也就是說,該指令碼必須在本機電腦上運行。
注意:這個問題有解決辦法嗎?事實上有解決辦法,儘管它要求您本地而不是遠程啟動進程。有關如何解決該問題的樣本,請參閱您好,指令碼專家!專欄。
串連到 WMI 服務後,我們就建立一個 WScript.Shell 對象的執行個體,我們將使用它來產生所有新的 Internet Explorer 執行個體。(是的,我們本來可以使用 WMI 來實現此目的的,但大多數人都發現使用 Wscript.Shell 運行程式要比使用 WMI 更容易。)接著我們建立一個只要 True 等於 True 時即啟動並執行 Do 迴圈。(除非哲學上有任何新的進展,否則這就意味著指令碼將永遠運行下去。要停止該指令碼,需要終止指令碼進程。如果您正運行在 CScrip 下的命令視窗中,只需按 Ctrl+C 或關閉命令視窗即可實現此操作,非常容易。)
那麼此迴圈執行什麼操作?首先,我們使用以下代碼來檢索當前在電腦上啟動並執行所有名為 iexplore.exe 的進程集合:
Set colProcesses = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = 'iexplore.exe'")
儘管會失去懸念,但還是要與當前在電腦上啟動並執行所有 Internet Explorer 執行個體的集合保持一致。然後,我們檢查 Count 屬性(該屬性可告訴我們集合中的項數)的值是否等於 0:
If colProcesses.Count = 0 Then
如果 Count 等於 0,則表示電腦上未運行任何 Internet Explorer 執行個體。因此,我們使用 Shell 對象和 Run 方法來啟動一個全新的執行個體:
objShell.Run "iexplore.exe"
就是這樣。接下來,使用 Sleep 方法將指令碼暫停 60 秒(60,000 毫秒)。60 秒之後,指令碼繼續執行,再次迴圈並重複該過程,直至永遠。如果所需時間間隔不是 60 秒,調整該值即可。例如,下面這行代碼將每 30 秒(30,000 毫秒)進行一次檢查:
Wscript.Sleep 30000
下面的代碼將每 10 分鐘(60,000 毫秒/每分鐘乘以 10 分鐘)運行一次檢查:
Wscript.Sleep 600000
不可否認,該代碼僅每 10 分鐘檢查一次 Internet Explorer 是否在工作。對於指令碼專家來說,就沒有必要再每 10 分鐘檢查一次他們是否在工作:畢竟,有沒有指令碼,您都知道該問題的答案。