帝王谷资源网 Design By www.wdxyy.com
问:
嗨,脚本专家!这是我想要完成的任务:我想要用一个脚本启动两个可执行文件。第一个应用程序关闭后,我想让这个脚本关闭第二个应用程序,然后退出。如何完成上述任务?
-- 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 方法:
"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 中,在远程计算机上启动的进程是在不可见的窗口中运行的;它们在屏幕上不可见。这意味着,处理远程计算机时,对于不需要任何用户交互的应用程序,此方法很有用;而对于确实需要用户干预的应用程序,此方法远不及其他方法有用(实际上完全没用)。
嗨,脚本专家!这是我想要完成的任务:我想要用一个脚本启动两个可执行文件。第一个应用程序关闭后,我想让这个脚本关闭第二个应用程序,然后退出。如何完成上述任务?
-- 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 方法:
"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 中,在远程计算机上启动的进程是在不可见的窗口中运行的;它们在屏幕上不可见。这意味着,处理远程计算机时,对于不需要任何用户交互的应用程序,此方法很有用;而对于确实需要用户干预的应用程序,此方法远不及其他方法有用(实际上完全没用)。
帝王谷资源网 Design By www.wdxyy.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
帝王谷资源网 Design By www.wdxyy.com
暂无评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
2024年12月22日
2024年12月22日
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]