一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - VBS - vbs中實現啟動兩個應用程序,一直等到其中一個程序結束,然后關閉另一個?

vbs中實現啟動兩個應用程序,一直等到其中一個程序結束,然后關閉另一個?

2020-07-10 18:15腳本之家 VBS

我想要用一個腳本啟動兩個可執行文件。第一個應用程序關閉后,我想讓這個腳本關閉第二個應用程序,然后退出。如何完成上述任務?

問:
嗨,腳本專家!這是我想要完成的任務:我想要用一個腳本啟動兩個可執行文件。第一個應用程序關閉后,我想讓這個腳本關閉第二個應用程序,然后退出。如何完成上述任務?

-- MK

答:
您好,MK。您知道,這是我們喜歡的那種類型的問題。為什么?因為它聽起來確實很復雜很棘手。如果有人想找我們做什么事,我們就可以說“您知道,我正在嘗試編寫這樣一個腳本:它能夠啟動兩個應用程序,等到第一個關閉后,然后自動關閉第二個。”然后他們肯定會說“噢,很抱歉。很顯然,你們很忙”,然后就不找我們了。

當然,他們不知道,這只是聽起來很困難。其實,它的難度也就相當于下面這個腳本而已:

復制代碼 代碼如下:


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 服務,具體地說,綁定到 Win32_Process 類。這就是我們現在要做的:

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2:Win32_Process")

然后,我們使用 Create 方法創建兩個新進程:Calc.exe 和 Notepad.exe。對于每個新進程,我們使用與下面這行代碼類似的代碼:

errResult = objWMIService.Create("calc.exe", null, null, intCalcID)

我們剩下要做的只是調用跟有下列內容的 Create 方法:

• 可執行文件的名稱(可能需要指定應用程序的完全路徑名稱,視您的計算機的設置而定)。

• 一對 Null 參數。使用這兩個參數,我們可以為應用程序指定不同的工作文件夾和配置某些其他啟動選項。在本示例代碼中,我們不需要考慮這些事情,因此我們只是將參數值設置為 Null。

• 起“輸出參數”作用的變量(名稱為 intCalcID)。創建這些進程后,分配給進程的 ProcessID 號也分配給這些輸出參數變量。


最終結果是我們啟動“計算器”,并且變量 intCalcID 中包含分配給“計算器”實例的進程 ID。然后,我們啟動“記事本”,并且變量 intNotepadID 中包含分配給“記事本”實例的 ProcessID。這就是啟動兩個應用程序并且跟蹤它們的方法。

下一步我們要做的是,嗯,基本沒什么了:我們要此腳本暫停,直到關閉“計算器”。要完成此任務,我們重新連接到 WMI 服務,然后使用 ExecNotificationQuery 監視任何刪除的進程。我們需要重新連接到 WMI 服務是因為在腳本的開始我們只是連接到 Win32_Process 類;因此,對象引用 (objWMIService) 只是引用此類。我們需要連接到“通用”WMI 服務,所以我們只是重新使用對象引用 objWMIService 并進行新連接:

Set colProcesses = objWMIService.ExecNotificationQuery _
    ("Select * From __InstanceDeletionEvent " _ 
            & "Within 1 Where TargetInstance ISA 'Win32_Process'")

這么做的原因何在?每次刪除一個進程,都要生成一個 __InstanceDeletionEvent 類實例。我們要檢查每個實例,看這些實例的進程 ID 是否為目標 ID,也就是分配給 intCalcID 的 ID。如果刪除的進程具有不同的 ID,則它不是“計算器”實例;在這種情況下,腳本將恢復監視。如果刪除的進程具有與 intCalcID 相同的 ID,則它一定是“計算器”實例(因為進程 ID 必須是唯一的)。在這種情況下,我們要停止監視,然后關閉“記事本”。

下面是實際執行監視的代碼:

Do Until i = 999
    Set objProcess = colProcesses.NextEvent
    If objProcess.TargetInstance.ProcessID = intCalcID Then
        Exit Do
    End If
Loop

這里我們做的是設置一個循環,該循環一直運行到變量 i 等于 999。現在,事實是變量 i 將始終不等于 999;這只是個小技巧,確保循環一直運行到“計算器”關閉。(我們如何知道變量 i 將始終不等于 999?是這樣,我們沒有為 i 賦值;因此,它取默認值 0。因為我們從未對該值進行任何更改,所以 i 始終為 0,因此將始終不等于 999。)

在循環中,我們使用此行代碼等待下一個刪除的進程:

Set objProcess = colProcesses.NextEvent

每次刪除進程我們都檢查 ProcessID 與分配給“計算器”的進程 ID 是否相符。如果相符,我們則使用 Exit Do 命令斷開循環,繼續腳本。如果不具有相同的 ID,則我們只需繼續循環,等待下一個刪除的進程。(正如我們上面所說的,i 將始終不等于 999,但是沒關系:使用 Exit Do 命令就可以脫離循環。)

注意。我們發現,我們有點草草掠過事件監視的整個思路。如果您對諸如 __InstanceDeletionEvent 和 colProcesses.NextEvent 的內容有點糊涂,請參閱腳本專家網絡廣播防患于未然:WMI 事件簡介(英文)。


現在,我們只需要終止我們啟動的“記事本”實例。要完成此任務,我們使用此 WMI 查詢檢索具有分配給“記事本”的進程 ID 的所有進程的集合:

Set colProcesses = objWMIService.ExecQuery _
    ("Select * from Win32_Process Where ProcessID = " & intNotepadID)

獲得此集合后,我們使用此代碼塊在整個進程集(只有一個進程)中循環,然后使用 Terminate 方法關閉應用程序:

For Each objProcess in colProcesses
    objProcess.Terminate()
Next

順便說一句,此方法既適用于遠程計算機也適用本地計算機;只需將變量 strComputer 的值更改為遠程計算機的名稱。但是,要記住,在 Windows XP 和 Windows Server 2003 中,在遠程計算機上啟動的進程是在不可見的窗口中運行的;它們在屏幕上不可見。這意味著,處理遠程計算機時,對于不需要任何用戶交互的應用程序,此方法很有用;而對于確實需要用戶干預的應用程序,此方法遠不及其他方法有用(實際上完全沒用)。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本成人免费在线视频 | 成人性爱视频在线观看 | 日本艳鉧动漫1~6完整版在 | 亚洲精品一区二区久久久久 | 欧美一级片在线视频 | 日本一卡2卡3卡4卡乱 | 国产精品合集久久久久青苹果 | 国产午夜精品久久久久小说 | 天天gan| 男女男在线精品网站免费观看 | 无人区在线观看免费观看 | 被教官揉了一晚上的奶小说 | 日本高清视频在线的 | 欧美综合亚洲图片综合区 | 2022日韩理论片在线观看 | 国产亚洲精aa在线观看不卡 | 免费一级生活片 | 好大用力深一点视频 | 海角社区在线登录 | 范冰冰好紧好滑好湿 | 国产成人夜色91 | 日本红色高清免费观看 | 免费看美女被靠到爽 | 欧美亚洲天堂 | 91久久线看在观草草青青 | 日本性爱 | gogo人体模特啪啪季玥图片 | 操出水视频 | 日韩欧美一区二区三区四区 | 午夜影院在线免费观看 | 久热人人综合人人九九精品视频 | 久久精品一卡二卡三卡四卡视频版 | 美国女艳星brandilove | 色婷综合 | 日韩r | 四虎最新永久免费网址 | 2018久久精品热在线观看 | 日本不卡视频免费 | 999任你躁在线精品免费不卡 | 456亚洲人成高清在线 | 日韩一区二区三 |