vbs中實(shí)現(xiàn)啟動(dòng)兩個(gè)應(yīng)用程序,一直等到其中一個(gè)程序結(jié)束,然后關(guān)閉另一個(gè)?
嗨,腳本專家!這是我想要完成的任務(wù):我想要用一個(gè)腳本啟動(dòng)兩個(gè)可執(zhí)行文件。第一個(gè)應(yīng)用程序關(guān)閉后,我想讓這個(gè)腳本關(guān)閉第二個(gè)應(yīng)用程序,然后退出。如何完成上述任務(wù)?
-- MK
答:
您好,MK。您知道,這是我們喜歡的那種類型的問(wèn)題。為什么?因?yàn)樗?tīng)起來(lái)確實(shí)很復(fù)雜很棘手。如果有人想找我們做什么事,我們就可以說(shuō)“您知道,我正在嘗試編寫(xiě)這樣一個(gè)腳本:它能夠啟動(dòng)兩個(gè)應(yīng)用程序,等到第一個(gè)關(guān)閉后,然后自動(dòng)關(guān)閉第二個(gè)?!比缓笏麄兛隙〞?huì)說(shuō)“噢,很抱歉。很顯然,你們很忙”,然后就不找我們了。
當(dāng)然,他們不知道,這只是聽(tīng)起來(lái)很困難。其實(shí),它的難度也就相當(dāng)于下面這個(gè)腳本而已:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2:Win32_Process")
errResult = objWMIService.Create("calc.exe", null, null, intCalcID)
errResult = objWMIService.Create("notepad.exe", null, null, intNotepadID)
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colProcesses = objWMIService.ExecNotificationQuery _
("Select * From __InstanceDeletionEvent " _
& "Within 1 Where TargetInstance ISA 'Win32_Process'")
Do Until i = 999
Set objProcess = colProcesses.NextEvent
If objProcess.TargetInstance.ProcessID = intCalcID Then
Exit Do
End If
Loop
Set colProcesses = objWMIService.ExecQuery _
("Select * from Win32_Process Where ProcessID = " & intNotepadID)
For Each objProcess in colProcesses
objProcess.Terminate()
Next
真的,請(qǐng)相信我們:您了解了腳本所完成的工作后,這其實(shí)就變得相當(dāng)簡(jiǎn)單了。我們首先連接到計(jì)算機(jī)上的 WMI 服務(wù),具體地說(shuō),綁定到 Win32_Process 類。這就是我們現(xiàn)在要做的:
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2:Win32_Process")
然后,我們使用 Create 方法創(chuàng)建兩個(gè)新進(jìn)程:Calc.exe 和 Notepad.exe。對(duì)于每個(gè)新進(jìn)程,我們使用與下面這行代碼類似的代碼:
errResult = objWMIService.Create("calc.exe", null, null, intCalcID)
我們剩下要做的只是調(diào)用跟有下列內(nèi)容的 Create 方法:
• 可執(zhí)行文件的名稱(可能需要指定應(yīng)用程序的完全路徑名稱,視您的計(jì)算機(jī)的設(shè)置而定)。
• 一對(duì) Null 參數(shù)。使用這兩個(gè)參數(shù),我們可以為應(yīng)用程序指定不同的工作文件夾和配置某些其他啟動(dòng)選項(xiàng)。在本示例代碼中,我們不需要考慮這些事情,因此我們只是將參數(shù)值設(shè)置為 Null。
• 起“輸出參數(shù)”作用的變量(名稱為 intCalcID)。創(chuàng)建這些進(jìn)程后,分配給進(jìn)程的 ProcessID 號(hào)也分配給這些輸出參數(shù)變量。
最終結(jié)果是我們啟動(dòng)“計(jì)算器”,并且變量 intCalcID 中包含分配給“計(jì)算器”實(shí)例的進(jìn)程 ID。然后,我們啟動(dòng)“記事本”,并且變量 intNotepadID 中包含分配給“記事本”實(shí)例的 ProcessID。這就是啟動(dòng)兩個(gè)應(yīng)用程序并且跟蹤它們的方法。
下一步我們要做的是,嗯,基本沒(méi)什么了:我們要此腳本暫停,直到關(guān)閉“計(jì)算器”。要完成此任務(wù),我們重新連接到 WMI 服務(wù),然后使用 ExecNotificationQuery 監(jiān)視任何刪除的進(jìn)程。我們需要重新連接到 WMI 服務(wù)是因?yàn)樵谀_本的開(kāi)始我們只是連接到 Win32_Process 類;因此,對(duì)象引用 (objWMIService) 只是引用此類。我們需要連接到“通用”WMI 服務(wù),所以我們只是重新使用對(duì)象引用 objWMIService 并進(jìn)行新連接:
Set colProcesses = objWMIService.ExecNotificationQuery _
("Select * From __InstanceDeletionEvent " _
& "Within 1 Where TargetInstance ISA 'Win32_Process'")
這么做的原因何在?每次刪除一個(gè)進(jìn)程,都要生成一個(gè) __InstanceDeletionEvent 類實(shí)例。我們要檢查每個(gè)實(shí)例,看這些實(shí)例的進(jìn)程 ID 是否為目標(biāo) ID,也就是分配給 intCalcID 的 ID。如果刪除的進(jìn)程具有不同的 ID,則它不是“計(jì)算器”實(shí)例;在這種情況下,腳本將恢復(fù)監(jiān)視。如果刪除的進(jìn)程具有與 intCalcID 相同的 ID,則它一定是“計(jì)算器”實(shí)例(因?yàn)檫M(jìn)程 ID 必須是唯一的)。在這種情況下,我們要停止監(jiān)視,然后關(guān)閉“記事本”。
下面是實(shí)際執(zhí)行監(jiān)視的代碼:
Do Until i = 999
Set objProcess = colProcesses.NextEvent
If objProcess.TargetInstance.ProcessID = intCalcID Then
Exit Do
End If
Loop
這里我們做的是設(shè)置一個(gè)循環(huán),該循環(huán)一直運(yùn)行到變量 i 等于 999。現(xiàn)在,事實(shí)是變量 i 將始終不等于 999;這只是個(gè)小技巧,確保循環(huán)一直運(yùn)行到“計(jì)算器”關(guān)閉。(我們?nèi)绾沃雷兞?nbsp;i 將始終不等于 999?是這樣,我們沒(méi)有為 i 賦值;因此,它取默認(rèn)值 0。因?yàn)槲覀儚奈磳?duì)該值進(jìn)行任何更改,所以 i 始終為 0,因此將始終不等于 999。)
在循環(huán)中,我們使用此行代碼等待下一個(gè)刪除的進(jìn)程:
Set objProcess = colProcesses.NextEvent
每次刪除進(jìn)程我們都檢查 ProcessID 與分配給“計(jì)算器”的進(jìn)程 ID 是否相符。如果相符,我們則使用 Exit Do 命令斷開(kāi)循環(huán),繼續(xù)腳本。如果不具有相同的 ID,則我們只需繼續(xù)循環(huán),等待下一個(gè)刪除的進(jìn)程。(正如我們上面所說(shuō)的,i 將始終不等于 999,但是沒(méi)關(guān)系:使用 Exit Do 命令就可以脫離循環(huán)。)
注意。我們發(fā)現(xiàn),我們有點(diǎn)草草掠過(guò)事件監(jiān)視的整個(gè)思路。如果您對(duì)諸如 __InstanceDeletionEvent 和 colProcesses.NextEvent 的內(nèi)容有點(diǎn)糊涂,請(qǐng)參閱腳本專家網(wǎng)絡(luò)廣播防患于未然:WMI 事件簡(jiǎn)介(英文)。
現(xiàn)在,我們只需要終止我們啟動(dòng)的“記事本”實(shí)例。要完成此任務(wù),我們使用此 WMI 查詢檢索具有分配給“記事本”的進(jìn)程 ID 的所有進(jìn)程的集合:
Set colProcesses = objWMIService.ExecQuery _
("Select * from Win32_Process Where ProcessID = " & intNotepadID)
獲得此集合后,我們使用此代碼塊在整個(gè)進(jìn)程集(只有一個(gè)進(jìn)程)中循環(huán),然后使用 Terminate 方法關(guān)閉應(yīng)用程序:
For Each objProcess in colProcesses
objProcess.Terminate()
Next
順便說(shuō)一句,此方法既適用于遠(yuǎn)程計(jì)算機(jī)也適用本地計(jì)算機(jī);只需將變量 strComputer 的值更改為遠(yuǎn)程計(jì)算機(jī)的名稱。但是,要記住,在 Windows XP 和 Windows Server 2003 中,在遠(yuǎn)程計(jì)算機(jī)上啟動(dòng)的進(jìn)程是在不可見(jiàn)的窗口中運(yùn)行的;它們?cè)谄聊簧喜豢梢?jiàn)。這意味著,處理遠(yuǎn)程計(jì)算機(jī)時(shí),對(duì)于不需要任何用戶交互的應(yīng)用程序,此方法很有用;而對(duì)于確實(shí)需要用戶干預(yù)的應(yīng)用程序,此方法遠(yuǎn)不及其他方法有用(實(shí)際上完全沒(méi)用)。
相關(guān)文章
VC中實(shí)現(xiàn)文字豎排的簡(jiǎn)單方法(推薦)
下面小編就為大家?guī)?lái)一篇VC中實(shí)現(xiàn)文字豎排的簡(jiǎn)單方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05VBS教程:函數(shù)-FormatPercent 函數(shù)
VBS教程:函數(shù)-FormatPercent 函數(shù)...2006-11-11VBS加密解密源碼(UserAccounts.CommonDialog) 腳本之家修正版
有時(shí)候自己寫(xiě)了VBS又怕共享后別人盜用你的源碼呢?這里提供了VBS程序源碼加密的方法。2011-02-02VBS 提取狗狗影視中的ED2K連接的實(shí)現(xiàn)代碼
這篇文章主要介紹了通過(guò)VBS 提取狗狗影視中的ED2K連接,需要的朋友可以參考下2013-07-07用VBS實(shí)現(xiàn)一個(gè)小鍵盤(pán)動(dòng)作CTRL+V粘貼操作與思路分析
我想實(shí)現(xiàn)當(dāng)有跳出窗口"請(qǐng)輸入"時(shí)的1.8秒后就發(fā)送一次 CTRL + V,把本來(lái)已經(jīng)復(fù)制到剪切版中的文字自動(dòng)粘貼過(guò)去呢2009-12-12vbs結(jié)合wget 實(shí)現(xiàn)下載網(wǎng)站圖片
本文主要實(shí)現(xiàn)了使用vbs腳本調(diào)用wget,下載網(wǎng)站所有頁(yè)面到本腳本目錄,并掃描本腳本目錄中所有文件,讀取本腳本目錄中的所有網(wǎng)頁(yè),匹配圖片 URL 地址,保存所有圖片 URL 地址到 url-img.txt 文件,然后調(diào)用wget: 下載 url-img.txt 指定的圖片到本腳本 img 目錄2014-09-09VBScript編寫(xiě)Windows防止鎖屏腳本程序
這篇文章主要為大家介紹了VBScript編寫(xiě)Windows防止鎖屏腳本程序示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2022-05-05文件夾定時(shí)自動(dòng)備份 AutoBackUpFolder.vbs
定時(shí)自動(dòng)備份文件夾到一個(gè)以時(shí)間命名的新目錄,設(shè)置好后加到啟動(dòng)項(xiàng)里,只要一啟動(dòng)機(jī)器程序就會(huì)自動(dòng)運(yùn)行,占系統(tǒng)資源可以不計(jì)。2009-07-07