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
Wscript.Echo objLatestEvent.TargetInstance.PartComponent
Loop
在此指令碼中含有太多細節,無法在此進行逐步說明,不過我們著重的地方在於 __InstanceCreationEvent 類別的例項;每次在電腦上建立新的管理物件 (也就是 WMI 所瞭解的物件) 時,就會自動建立此類別的例項。雖然這段查詢有些複雜,不過總而言之便是如此:我們希望對出現在 C:\Scripts 中的任何新項目收到警訊 (請注意,C:\\\\Scripts 不是誤印,這裡您的確需要 4 個斜線。)
我們也必須指出,像這樣的 WMI 指令碼是以「輪詢」方式作用的。指令碼會定期啟動並檢查資料夾中是否有新增任何新檔案。在此範例中,我們每 10 秒鐘檢查一次 (也就是 WITHIN 10 的代表意思),查看資料夾中是否有任何新的檔案。如果這樣會太快或太慢的話,您可以將此數值變更成您要的任何數值。不過,請留意兩項問題。首先,如果您過於頻繁地輪詢 (比如說,每秒鐘一次),指令碼就會持續執行,而且理論上可能會耗盡您的系統資源。
相反的,如果您讓這個時間值變得太大,則若在輪詢時間到期之前便已將檔案新增並刪除,就有可能錯過新的檔案。例如:假設您的指令碼每 5 分鐘檢查一次新的檔案。如果您新增了 100 個新檔案,並在 3 分鐘後刪除了所有這些檔案,指令碼就始終不會知道在資料夾中曾經新增過這些檔案。這是因為像這樣的指令碼,是將目前資料夾中的檔案,以及上次指令碼檢查時資料夾時的檔案,兩者互相比較而產生作用的。請任意調整輪詢間隔,看看何種數值最適合您。
如同我們曾經提到的,這個指令碼會直接傳回新增到 C:\Scripts 的任何新檔案的名稱。如果您希望每次對資料夾新增檔案時,便製造一些有趣點兒的效果,又該怎麼辦?沒問題;您只需要將以下這行程式碼,取代為您要在每次偵測到新檔案時執行的程式碼:
Wscript.Echo objLatestEvent.TargetInstance.PartComponent
對了,您寧可每次從 C:\Scripts「刪除」檔案時都收到通知嗎?這也是很容易的;只要監視 C:\Scripts 中的 __InstanceDeletionEvent 類別的新例項即可辦到:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\cimv2")
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceDeletionEvent WITHIN 10 WHERE " _
& "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _
& "TargetInstance.GroupComponent= " _
& "'Win32_Directory.Name=""c:\\\\scripts""'")
Do
Set objLatestEvent = colMonitoredEvents.NextEvent
Wscript.Echo objLatestEvent.TargetInstance.PartComponent
Loop
嘿,我們就告訴您嘛,瞭解 WMI 事件是很值得的! |