快速业务通道

vbs中实现启动两个应用程序,一直等到其中一个程序结束,然后关闭另一个?

作者 佚名 来源 ASP编程 浏览 发布时间 2013-07-09
问:
嗨,脚本专家!这是我想要完成的任务:我想要用一个脚本启动两个可执行文件。第一个应用程序关闭后,我想让这个脚本关闭第二个应用程序,然后退出。如何完成上述任务?

--MK

答:
您好,MK。您知道,这是我们喜欢的那种类型的问题。为什么?因为它听起来确实很复杂很棘手。如果有人想找我们做什么事,我们就可以说“您知道,我正在尝试编写这样一个脚本:它能够启动两个应用程序,等到第一个关闭后,然后自动关闭第二个。”然后他们肯定会说“噢,很抱歉。很显然,你们很忙”,然后就不找我们了。

当然,他们不知道,这只是听起来很困难。其实,它的难度也就相当于下面这个脚本而已:

复制代码 代码如下:

strComputer="."
SetobjWMIService=GetObject("winmgmts:\\"&strComputer&"\root\cimv2:Win32_Process")

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

SetobjWMIService=GetObject("winmgmts:\\"&strComputer&"\root\cimv2")

SetcolProcesses=objWMIService.ExecNotificationQuery_
("Select*From__InstanceDeletionEvent"_
&"Within1WhereTargetInstanceISA''Win32_Process''")

DoUntili=999
SetobjProcess=colProcesses.NextEvent
IfobjProcess.TargetInstance.ProcessID=intCalcIDThen
ExitDo
EndIf
Loop

SetcolProcesses=objWMIService.ExecQuery_
("Select*fromWin32_ProcessWhereProcessID="&intNotepadID)

ForEachobjProcessincolProcesses
objProcess.Terminate()
Next

真的,请相信我们:您了解了脚本所完成的工作后,这其实就变得相当简单了。我们首先连接到计算机上的WMI服务,具体地说,绑定到Win32_Process类。这就是我们现在要做的:

SetobjWMIService=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并进行新连接:

SetcolProcesses=objWMIService.ExecNotificationQuery_
("Select*From__InstanceDeletionEvent"_
&"Within1WhereTargetInstanceISA''Win32_Process''")

这么做的原因何在?每次删除一个进程,都要生成一个__InstanceDeletionEvent类实例。我们要检查每个实例,看这些实例的进程ID是否为目标ID,也就是分配给intCalcI

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号