vbs中實現(xiàn)啟動兩個應(yīng)用程序,一直等到其中一個程序結(jié)束,然后關(guān)閉另一個?
問:
嗨,腳本專家!這是我想要完成的任務(wù):我想要用一個腳本啟動兩個可執(zhí)行文件。第一個應(yīng)用程序關(guān)閉后,我想讓這個腳本關(guān)閉第二個應(yīng)用程序,然后退出。如何完成上述任務(wù)?
-- MK
答:
您好,MK。您知道,這是我們喜歡的那種類型的問題。為什么?因為它聽起來確實很復(fù)雜很棘手。如果有人想找我們做什么事,我們就可以說“您知道,我正在嘗試編寫這樣一個腳本:它能夠啟動兩個應(yīng)用程序,等到第一個關(guān)閉后,然后自動關(guān)閉第二個?!比缓笏麄兛隙〞f“噢,很抱歉。很顯然,你們很忙”,然后就不找我們了。
當然,他們不知道,這只是聽起來很困難。其實,它的難度也就相當于下面這個腳本而已:
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
真的,請相信我們:您了解了腳本所完成的工作后,這其實就變得相當簡單了。我們首先連接到計算機上的 WMI 服務(wù),具體地說,綁定到 Win32_Process 類。這就是我們現(xiàn)在要做的:
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2:Win32_Process")
然后,我們使用 Create 方法創(chuàng)建兩個新進程:Calc.exe 和 Notepad.exe。對于每個新進程,我們使用與下面這行代碼類似的代碼:
errResult = objWMIService.Create("calc.exe", null, null, intCalcID)
我們剩下要做的只是調(diào)用跟有下列內(nèi)容的 Create 方法:
• 可執(zhí)行文件的名稱(可能需要指定應(yīng)用程序的完全路徑名稱,視您的計算機的設(shè)置而定)。
• 一對 Null 參數(shù)。使用這兩個參數(shù),我們可以為應(yīng)用程序指定不同的工作文件夾和配置某些其他啟動選項。在本示例代碼中,我們不需要考慮這些事情,因此我們只是將參數(shù)值設(shè)置為 Null。
• 起“輸出參數(shù)”作用的變量(名稱為 intCalcID)。創(chuàng)建這些進程后,分配給進程的 ProcessID 號也分配給這些輸出參數(shù)變量。
最終結(jié)果是我們啟動“計算器”,并且變量 intCalcID 中包含分配給“計算器”實例的進程 ID。然后,我們啟動“記事本”,并且變量 intNotepadID 中包含分配給“記事本”實例的 ProcessID。這就是啟動兩個應(yīng)用程序并且跟蹤它們的方法。
下一步我們要做的是,嗯,基本沒什么了:我們要此腳本暫停,直到關(guān)閉“計算器”。要完成此任務(wù),我們重新連接到 WMI 服務(wù),然后使用 ExecNotificationQuery 監(jiān)視任何刪除的進程。我們需要重新連接到 WMI 服務(wù)是因為在腳本的開始我們只是連接到 Win32_Process 類;因此,對象引用 (objWMIService) 只是引用此類。我們需要連接到“通用”WMI 服務(wù),所以我們只是重新使用對象引用 objWMIService 并進行新連接:
Set colProcesses = objWMIService.ExecNotificationQuery _
("Select * From __InstanceDeletionEvent " _
& "Within 1 Where TargetInstance ISA 'Win32_Process'")
這么做的原因何在?每次刪除一個進程,都要生成一個 __InstanceDeletionEvent 類實例。我們要檢查每個實例,看這些實例的進程 ID 是否為目標 ID,也就是分配給 intCalcID 的 ID。如果刪除的進程具有不同的 ID,則它不是“計算器”實例;在這種情況下,腳本將恢復(fù)監(jiān)視。如果刪除的進程具有與 intCalcID 相同的 ID,則它一定是“計算器”實例(因為進程 ID 必須是唯一的)。在這種情況下,我們要停止監(jiān)視,然后關(guān)閉“記事本”。
下面是實際執(zhí)行監(jiān)視的代碼:
Do Until i = 999
Set objProcess = colProcesses.NextEvent
If objProcess.TargetInstance.ProcessID = intCalcID Then
Exit Do
End If
Loop
這里我們做的是設(shè)置一個循環(huán),該循環(huán)一直運行到變量 i 等于 999?,F(xiàn)在,事實是變量 i 將始終不等于 999;這只是個小技巧,確保循環(huán)一直運行到“計算器”關(guān)閉。(我們?nèi)绾沃雷兞?nbsp;i 將始終不等于 999?是這樣,我們沒有為 i 賦值;因此,它取默認值 0。因為我們從未對該值進行任何更改,所以 i 始終為 0,因此將始終不等于 999。)
在循環(huán)中,我們使用此行代碼等待下一個刪除的進程:
Set objProcess = colProcesses.NextEvent
每次刪除進程我們都檢查 ProcessID 與分配給“計算器”的進程 ID 是否相符。如果相符,我們則使用 Exit Do 命令斷開循環(huán),繼續(xù)腳本。如果不具有相同的 ID,則我們只需繼續(xù)循環(huán),等待下一個刪除的進程。(正如我們上面所說的,i 將始終不等于 999,但是沒關(guān)系:使用 Exit Do 命令就可以脫離循環(huán)。)
注意。我們發(fā)現(xiàn),我們有點草草掠過事件監(jiān)視的整個思路。如果您對諸如 __InstanceDeletionEvent 和 colProcesses.NextEvent 的內(nèi)容有點糊涂,請參閱腳本專家網(wǎng)絡(luò)廣播防患于未然:WMI 事件簡介(英文)。
現(xiàn)在,我們只需要終止我們啟動的“記事本”實例。要完成此任務(wù),我們使用此 WMI 查詢檢索具有分配給“記事本”的進程 ID 的所有進程的集合:
Set colProcesses = objWMIService.ExecQuery _
("Select * from Win32_Process Where ProcessID = " & intNotepadID)
獲得此集合后,我們使用此代碼塊在整個進程集(只有一個進程)中循環(huán),然后使用 Terminate 方法關(guān)閉應(yīng)用程序:
For Each objProcess in colProcesses
objProcess.Terminate()
Next
順便說一句,此方法既適用于遠程計算機也適用本地計算機;只需將變量 strComputer 的值更改為遠程計算機的名稱。但是,要記住,在 Windows XP 和 Windows Server 2003 中,在遠程計算機上啟動的進程是在不可見的窗口中運行的;它們在屏幕上不可見。這意味著,處理遠程計算機時,對于不需要任何用戶交互的應(yīng)用程序,此方法很有用;而對于確實需要用戶干預(yù)的應(yīng)用程序,此方法遠不及其他方法有用(實際上完全沒用)。
上一篇:在vbs運行命令行工具后讓命令窗口保持打開狀態(tài)的腳本
欄 目:vb
下一篇:用vbs實現(xiàn)返回 IP 配置數(shù)據(jù)
本文標題:vbs中實現(xiàn)啟動兩個應(yīng)用程序,一直等到其中一個程序結(jié)束,然后關(guān)閉另一個?
本文地址:http://mengdiqiu.com.cn/a1/vb/7885.html
您可能感興趣的文章
- 01-10下載文件到本地運行的vbs
- 01-10VBS中的正則表達式的用法大全 <font color=red>原創(chuàng)&
- 01-10VBS中SendKeys的基本應(yīng)用
- 01-10VBScript教程 第十一課深入VBScript
- 01-10用VBSCRIPT控制ONSUBMIT事件
- 01-10VBScript語法速查及實例說明
- 01-10VBS中Select CASE的其它用法
- 01-10VBScript教程 第七課使用條件語句
- 01-10vbscript 可以按引用傳遞參數(shù)嗎?
- 01-10VBScript教程 第二課在HTML頁面中添加VBscript代碼


閱讀排行
本欄相關(guān)
- 01-10下載文件到本地運行的vbs
- 01-10飄葉千夫指源代碼,又稱qq刷屏器
- 01-10SendKeys參考文檔
- 01-10什么是一個高效的軟件
- 01-10VBS中的正則表達式的用法大全 &l
- 01-10exe2swf 工具(Adodb.Stream版)
- 01-10VBS中SendKeys的基本應(yīng)用
- 01-10用VBSCRIPT控制ONSUBMIT事件
- 01-10VBScript教程 第十一課深入VBScript
- 01-10VBScript語法速查及實例說明
隨機閱讀
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10C#中split用法實例總結(jié)
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文