用vbs确定可移动驱动器的连接时间
作者 佚名
来源 ASP编程
浏览
发布时间 2013-07-09
问: 您好,脚本专家!如何确定USB闪存驱动器的连接时间? --PS 答: 您好,PS。是的,我们承认:脚本专家确实懒惰。(尤其是在周五,这一天我们必须编写周一专栏。)可能有一种方法能够专门监视何时插入USB闪存驱动器。但是,我们找不到这种方法,至少不能马上找到它。不可否认,或许我们可能感觉有点困难。但是,我们还是决定编写一个脚本,用来告诉您任何可移动驱动器与计算机连接(或断开连接)的时间。我们希望这样可以为您提供一些附加价值和灵活性。 嗨,我们并没有说我们确实已为您提供了附加价值和灵活性。我们只是希望自己能够做到。 实际上,这是一个容易编写的小脚本。另外,它还有一个优点,就是能够在任意版本的Windows上运行。(最初,我们曾经不加思索地想要使用Win32_VolumeChangeEvent类来完成这项任务,但是,该特定WMI类只能在WindowsServer2003上找到。) 该段代码如下所示: 复制代码 代码如下: strComputer="." SetobjWMIService=GetObject("winmgmts:\\"&strComputer&"\root\cimv2") SetcolEvents=objWMIService.ExecNotificationQuery_ ("Select*From__InstanceOperationEventWithin10Where"_ &"TargetInstanceisa''Win32_LogicalDisk''") DoWhileTrue SetobjEvent=colEvents.NextEvent IfobjEvent.TargetInstance.DriveType=2Then SelectCaseobjEvent.Path_.Class Case"__InstanceCreationEvent" Wscript.Echo"Drive"&objEvent.TargetInstance.DeviceId&_ "hasbeenadded." Case"__InstanceDeletionEvent" Wscript.Echo"Drive"&objEvent.TargetInstance.DeviceId&_ "hasbeenremoved." EndSelect EndIf Loop 是的,它确实类似于几天前我们向您展示的屏幕保护程序监视脚本。我们希望重复使用同一个脚本为您提供附加价值和灵活性。(尽管这主要是确保我们能够节省精力。) 此脚本首先连接到本地计算机上的WMI服务。然后,我们发出以下查询: SetcolEvents=objWMIService.ExecNotificationQuery_ ("Select*From__InstanceOperationEventWithin10Where"_ &"TargetInstanceISA''Win32_LogicalDisk''") 这个查询起什么作用呢?嗯,这里我们要使用ExecNotificationQuery方法来订阅一组特定的WMI事件。什么WMI事件?(伙计,您的问题太多了,不是吗?)在本例中,我们希望在每次更改Win32_LogicalDisk类的实例时我们都会得到通知。正如您马上就能看到的,这些更改将包括:为该类创建一个新实例(即,添加一个可移动驱动器)和删除该类的一个现有实例(即,取下一个可移动驱动器)。Within10只是意味着每10秒钟我们将检查一次,看看是否有任何Win32_LogicalDisk实例发生了变化。 是的,这也意味着,如果您插入了一个可移动驱动器,然后在6秒钟后将其取出,那么我们可能永远也不会知道这件事。如果这是个问题,那么将10改为一个更小的数值。也可以将10改为一个更大的数值。例如,将10改为60,就会每60秒钟进行一次检查,而不是每10秒钟。 明白了吗?我们甚至将附加价值和灵活性加入了代码自身中! 然后,我们建立一个不停运行的Do循环:: DoWhileTrue 接下来我们遇到了下面这行代码: SetobjEvent=colEvents.NextEvent 正如我们在上一专栏中说过的,这行代码将使脚本“中断”,意思就是脚本将暂停在此行,直到Win32_LogicalDisk类发生变化为止。这种变化(可以是创建了新实例或者是删除/修改了一个现有实例)将使脚本执行Do循环中的其余代码行。 好问题:剩下那些行代码究竟要做什么?嗯,首先看一下生成事件的驱动器是否恰好为可移动驱动器(至少就WMI而言,DriveType为2): IfobjEvent.TargetInstance.DriveType=2Then 如果DriveType不是2,那么我们只能再循环并等待下一个事件的发生。如果DriveType等于2,那么我们使用SelectCase块来确定发生的是哪种类型的事件。我们可通过确定事件的Class来执行此操作: SelectCaseobjEvent.Path_.Class 为什么这样做?有两个原因:首先,我们并不关心现有实例所发生的任何变化。例如,我们并不关心驱动器C上的可用驱动器空间是否发生了变化。如果您看一下SelectCase代码,您就会注意到我们并不去费神检查__InstanceModificationEvent。为什么不呢?因为我们并不关心__InstanceModificationEvent(以某种方式修改现有实例时生成的事件的类型)。 其次,我们想要对__InstanceCreationEvent(它会告诉我们已经创建了一个新驱动器)和__InstanceDeletionEvent(它会告诉我们已经删除了一个现有驱动器)加以区别。通过确定事件类型,我们可以回显不同(并相应)的消息。例如,下面是用于确定是否创建了新驱动器的代码,如果是,则回显一条用于指示该结果的消息: Case"__InstanceCreationEvent" Wscript.Echo"Drive"&objEvent.TargetInstance.DeviceId&_ "hasbeenadded." 下面是用于通知我们是否删除了现有驱动器的代码: Case"__InstanceDeletionEvent" Wscript.Echo"Drive"&objEvent.TargetInstance.DeviceId&_ "hasbeenremoved." 回显相应的消息后,我们再循环并等待下一个事件的发生。默认情况下,该脚本将永远运行下去,或者至少在您终止该脚本进程之前会是这样。先发生哪种情况就先执行哪段代码。 正如我们说过的,这并不是您真正想要的,但是它确实能够达到这一目的。哦,不要忘了附加价值和灵活性。这应该足以弥补一个事实,那就是我们并没有真正回答您的问题。(我们希望我们已经解答了该问题的一个方面。不过这不是您的问题。) |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于用vbs确定可移动驱动器的连接时间的所有评论