strDate = "20031102000000.000000+000"
strComputer = "."
Set objWMIService = GetObject _
("winmgmts:\\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService.ExecQuery _
("Select * From CIM_DataFile Where CreationDate < '" & strDate & "'")
For Each objFile in colFiles
Wscript.Echo objFile.Name
Next
我們明白您的想法:指令碼怎麼知道目標日期是 2003 年 11 月 2 日?畢竟指令碼中「沒有」任何地方出現 2003 年 11 月 2 日。
信不信,雖然指派給變數 strDate 的值 20031102000000.000000+000 看起來可能不像是日期,但它的確代表 2003 年 11 月 2 日。這個日期之所以奇怪是因為 WMI 使用的是國際標準時 (UTC,Universal Time Coordinate) 格式。在 UTC 格式中,前四個數字 (2003) 代表年份,接著兩個數字 (11) 代表月份,而後兩個 (02) 則代表日期。換句話說,20031102 就等於是 2003/11/02。
順便一提,接下來的六個數字代表 24 小時格式的時、分和秒,這裡保留為 0 是因為我們不在意某個特定的時間 (也就是說,我們並沒有特別要找 2003 年 11 月 2 日下午 2:37 以前建立的檔案)。句點後的六個數字代表毫秒,它們應該永遠都保留為零。最後,+000 代表對格林威治標準時間的時區差距。這個時區差距可以讓您在不同時區的電腦間調節日期和時間,但這不是現在要關心的問題。相反的,我們將時區差距保留為 +000,告知電腦要使用本地時間。
所以我們「必須」使用這種 UTC 格式傳遞日期和時間?是的。而且在 Windows 2000 (含) 以前的版本中,您必須以這種方式輸入日期。然而,在 Windows XP 和 Windows 2003 的新 WMI 物件 SWbemDateTime,可以讓您使用舊的西式日期進行輸入 (好比 11/2/2003),然後再將該日期自動轉換為 UTC 格式。
Scripting Guy 廣告:想要更進一步瞭解 SWbemDateTime 嗎?那麼請鎖定即將在 1 月份推出的「一週指令碼第 2 篇」。
指派日期給 strDate 後,剩下來的就只是單純的 WMI 指令碼,用於搜尋 CreationDate 早於 2003/11/2 的所有檔案,當找到後就回應檔名。
當然,您要求的是「刪除」舊檔案的指令碼。如果是這樣的話,則只要將程式碼行 Wscript.Echo objFile.Name 取代為這行程式碼:
objFile.Delete
為什麼不直接將這行程式碼放入給您的指令碼中?因為,我們希望您在實際執行前先想想這段指令碼。假設在電腦上有一個磁碟機 (C),您「真的」想要執行一個指令碼,刪除所有於 2003 年 11 月 2 日前建立的檔案嗎?畢竟,這個動作將會刪除大部份的作業系統和應用程式檔案。一般而言,這不會是您想要做的事。
這也就代表在搜尋檔案時,您可能需要多費點心思。舉例來說,假設電腦有兩個磁碟機:磁碟機 C 包含作業系統和所有應用程式,而磁碟機 D 包含您所有的文件。這種情況下,您應該撰寫的 WQL 查詢是只在磁碟機 D 上搜尋 2003 年 11 月 2 日前建立的檔案:
strDate = "20031102000000.000000+000"
strComputer = "."
Set objWMIService = GetObject _
("winmgmts:\\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService.ExecQuery _
("Select * From CIM_DataFile Where CreationDate < '" & strDate & "'" & _
" AND Drive = 'D:'")
For Each objFile in colFiles
Wscript.Echo objFile.Name
Next
另外,或許您的刪除目標只是不要用的 Word 舊文件。這種情況下,只要搜尋具有 doc 副檔名且建立於 2003 年 11 月 2 日前的檔案:
strDate = "20031102000000.000000+000"
strComputer = "."
Set objWMIService = GetObject _
("winmgmts:\\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService.ExecQuery _
("Select * From CIM_DataFile Where CreationDate < '" & strDate & "'" & _
" AND Extension = 'doc'")
For Each objFile in colFiles
Wscript.Echo objFile.Name
Next
有各式各樣的方式可以好好琢磨您的搜尋,如需詳細資訊,請參閱《Microsoft Windows 2000 指令碼指南》(Microsoft Windows 2000 Scripting Guide) 中的檔案及資料夾章節 (英文)。
順便一提,有許多讀者詢問是否有可能針對檔案的上次修改時間,進行檔案搜尋。當然可以,只要將其中一個前述指令碼的 CreationDate 改成 LastModified 即可。換句話說:
strDate = "20031102000000.000000+000"
strComputer = "."
Set objWMIService = GetObject _
("winmgmts:\\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService.ExecQuery _
("Select * From CIM_DataFile Where LastModified < '" & strDate & "'")
For Each objFile in colFiles
Wscript.Echo objFile.Name
Next
|