嗨,Scripting Guy!

Hey,Scripting Guy!

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

今天的問題:我要如何刪除比指定日期還舊的所有檔案?


我要如何刪除比指定日期還舊的所有檔案?

嗨,Scripting Guy!我想要有一個指令碼,它可以在電腦上搜尋比某個日期還舊的所有檔案,然後再自動刪除這些檔案。我可以做到這點嗎?

-- GM

GM,您好。您可以撰寫一個會在電腦上搜尋並刪除所有舊檔案的指令碼嗎?當然可以。您有必要撰寫一個會在電腦上搜尋並刪除所有舊檔案的指令碼嗎?那是另一個待會會處理的問題。

讓我們從程式碼本身開始進行。以下程式碼會於電腦上搜尋在 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 & "'")
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

如需詳細資訊

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

 

回到頁首 回到頁首