使用WMI的Vbscript有多个实例

时间:2014-09-27 17:51:00

标签: vbscript wmi

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

如何恢复脚本? 编辑:我发现了一个临时修复,即使用重启WMI服务  net stop winmgmt  net start winmgmt 但这是不实际的,因为我每次都必须重新启动WMI以使用WMI测试vbscript。

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

enter image description here

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

Set objWMIService = Nothing