热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

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

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 中,在远程计算机上启动的进程是在不可见的窗口中运行的;它们在屏幕上不可见。这意味着,处理远程计算机时,对于不需要任何用户交互的应用程序,此方法很有用;而对于确实需要用户干预的应用程序,此方法远不及其他方法有用(实际上完全没用)。


推荐阅读
  • 优化联通光猫DNS服务器设置
    本文详细介绍了如何为联通光猫配置DNS服务器地址,以提高网络解析效率和访问体验。通过智能线路解析功能,域名解析可以根据访问者的IP来源和类型进行差异化处理,从而实现更优的网络性能。 ... [详细]
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 介绍一个提供正版Windows软件下载的权威网站,确保用户能够安全合法地获取所需软件。 ... [详细]
  • c# – UWP:BrightnessOverride StartOverride逻辑 ... [详细]
  • 优化版Windows 10 LTSC 21H2企业版:适用于低内存设备
    此版本为经过优化的Windows 10 LTSC 21H2企业版,特别适合低内存配置的计算机。它基于官方版本进行了精简和性能优化,确保在资源有限的情况下依然能够稳定运行。 ... [详细]
  • 解决Linux系统中pygraphviz安装问题
    本文探讨了在Linux环境下安装pygraphviz时遇到的常见问题,并提供了详细的解决方案和最佳实践。 ... [详细]
author-avatar
sweet梓潼_470
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有