使用WMI的Vbscript具有多个实例

使用WMI的Vbscript具有多个实例,vbscript,wmi,Vbscript,Wmi,我想创建一个脚本,当一个新文件被添加到一个文件夹时,它将运行一个声音。 问题是我至少打开了5次vbscript来测试代码,当我只添加1个文件时,代码运行了5次。看起来脚本的多个实例正在同时运行 如何恢复脚本? 编辑:我找到了一个临时修复程序,即使用重新启动WMI服务 净停止winmgmt 净启动winmgmt 但这并不实际,因为每次使用WMI测试vbscript时,我都必须重新启动WMI Dim objShell Set objShell = Wscript.CreateObject("WScr

我想创建一个脚本,当一个新文件被添加到一个文件夹时,它将运行一个声音。 问题是我至少打开了5次vbscript来测试代码,当我只添加1个文件时,代码运行了5次。看起来脚本的多个实例正在同时运行

如何恢复脚本? 编辑:我找到了一个临时修复程序,即使用重新启动WMI服务 净停止winmgmt 净启动winmgmt 但这并不实际,因为每次使用WMI测试vbscript时,我都必须重新启动WMI

Dim objShell
Set objShell = Wscript.CreateObject("WScript.Shell")


strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & _
        strComputer & "\root\cimv2")
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
   ("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE " _
        & "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _
            & "TargetInstance.GroupComponent= " _
                & "'Win32_Directory.Name=""c:\\\\scripts""'")
Do
    Set objLatestEvent = colMonitoredEvents.NextEvent
    objShell.Run "Soundscript.vbs" 
    ' Using Set is mandatory
    Set objShell = Nothing
    Set objWMIService = Nothing

Loop

您有一个无限循环,如果有意的话,这很好,但这意味着对于测试,您将始终必须终止该进程(因为不存在导致它自行退出的条件)。如果双击脚本进行测试,则必须终止wscript.exe进程以终止脚本;或者,对于测试,打开命令提示符并通过cscript运行脚本可能更容易,例如,
cscript C:\scripts\myscript.vbs
,这将允许您在需要时通过向命令提示符发送Ctrl+C来终止脚本


现在我要反驳我自己,因为在你的脚本中有一些东西会导致它退出,也就是说,你正在破坏循环中的
objShell
对象,但在下一次迭代中再次使用它。这将导致在第二次迭代时出现运行时错误,导致脚本终止(因为未启用错误处理)。您可以很高兴地从循环中删除两条
Set x=Nothing
语句。

右键单击cscript.exe测试脚本,如下所示。双击运行脚本将默认使用在后台运行的wscript.exe

不应添加以下代码。它将处理绑定到事件侦听器的WMI对象,退出循环和脚本

Set objWMIService = Nothing