2014-09-27 64 views
0

我想要創建一個腳本,當一個新文件被添加到一個文件夾時它將運行一個聲音。 問題是我打開vbscript至少5次來測試代碼,並且當我只添加1個文件時代碼運行5次。它看起來像腳本的多個實例同時運行。使用WMI的Vbscript有多個實例

如何恢復腳本? 編輯:我發現了一個臨時修復,這是重新啓動WMI服務使用 淨停止winmgmt 淨啓動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

你有一個無限循環,這是好的,如果故意的,但意味着測試你總會有終止的進程(因爲沒有條件,導致其退出自身)。如果您雙擊腳本進行測試,您必須殺死wscript.exe進程才能終止腳本;或者爲了測試,可能更容易打開命令提示符並通過cscript運行腳本,例如, cscript C:\scripts\myscript.vbs這將允許您通過將Ctrl + C發送到命令提示符來在需要時終止腳本。

現在我會反駁自己,因爲腳本中會有一些內容會導致它退出,也就是說,您正在銷燬循環中的objShell對象,但在下一次迭代中再次使用它。這將在第二次迭代中導致運行時錯誤,導致腳本終止(因爲未啓用錯誤處理)。你可以很高興地從你的循環中刪除你的Set x = Nothing聲明。

0

使用cscript.exe通過右鍵單擊來測試腳本,如下所示。雙擊運行腳本將默認使用在後臺運行的wscript.exe。

enter image description here

下面的代碼不應該添加。它將處理綁定到事件偵聽器的WMI對象,退出循環和腳本。

Set objWMIService = Nothing