是的,它确实类似于几天前我们向您展示的屏幕保护程序监视脚本。我们希望重复使用同一个脚本为您提供附加价值和灵活性。(尽管这主要是确保我们能够节省精力。)
此脚本首先连接到本地计算机上的 WMI 服务。然后,我们发出以下查询:
Set colEvents = objWMIService.ExecNotificationQuery _
("Select * From __InstanceOperationEvent Within 10 Where " _
& "TargetInstance ISA 'Win32_LogicalDisk'")
这个查询起什么作用呢?嗯,这里我们要使用 ExecNotificationQuery 方法来订阅一组特定的 WMI 事件。什么 WMI 事件?(伙计,您的问题太多了,不是吗?)在本例中,我们希望在每次更改 Win32_LogicalDisk 类的实例时我们都会得到通知。正如您马上就能看到的,这些更改将包括:为该类创建一个新实例(即,添加一个可移动驱动器)和删除该类的一个现有实例(即,取下一个可移动驱动器)。Within 10 只是意味着每 10 秒钟我们将检查一次,看看是否有任何 Win32_LogicalDisk 实例发生了变化。
是的,这也意味着,如果您插入了一个可移动驱动器,然后在 6 秒钟后将其取出,那么我们可能永远也不会知道这件事。如果这是个问题,那么将 10 改为一个更小的数值。也可以将 10 改为一个更大的数值。例如,将 10 改为 60,就会每 60 秒钟进行一次检查,而不是每 10 秒钟。
明白了吗?我们甚至将附加价值和灵活性加入了代码自身中!
然后,我们建立一个不停运行的 Do 循环::
Do While True
接下来我们遇到了下面这行代码:
Set objEvent = colEvents.NextEvent
正如我们在上一专栏中说过的,这行代码将使脚本“中断”,意思就是脚本将暂停在此行,直到 Win32_LogicalDisk 类发生变化为止。这种变化(可以是创建了新实例或者是删除/修改了一个现有实例)将使脚本执行 Do 循环中的其余代码行。
好问题:剩下那些行代码究竟要做什么?嗯,首先看一下生成事件的驱动器是否恰好为可移动驱动器(至少就 WMI 而言,DriveType 为 2):
If objEvent.TargetInstance.DriveType = 2 Then
如果 DriveType 不是 2,那么我们只能再循环并等待下一个事件的发生。如果 DriveType 等于 2,那么我们使用 Select Case 块来确定发生的是哪种类型的事件。我们可通过确定事件的 Class 来执行此操作:
Select Case objEvent.Path_.Class







