Share via


嗨,Scripting Guy!

Hey,Scripting Guy!

歡迎使用全新的 TechNet 專欄,Microsoft Scripting Guy 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

今天的問題:我要如何在每次對資料夾新增檔案時自動執行指令碼?


我要如何在每次對資料夾新增檔案時自動執行指令碼?

嗨,Scripting Guy!是否有可能在每次對特定資料夾新增檔案時,自動執行指令碼?

-- MB

MB,您好。是的,這「是」可能的。都要感謝神奇的 WMI 事件,這種事件讓您能夠撰寫指令碼以監視特定事件 (就像對資料夾新增檔案),並在每次發生這種事件時,都能採取一些動作。在此專欄中,我們沒有時間可以詳細討論 WMI 事件,不過這類事件對於指令碼的撰寫者是極為有用的。因此,參閱這個指令碼的故事專欄,對您可能會是非常值得的。

同時,以下是監視 C:\Scripts 資料夾的指令碼。在每次對資料夾新增檔案時,這個指令碼會傳回新檔案的名稱做為回應:

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 事件是很值得的!


如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首