Scripting
用於刪除最舊文件的 Powershell 腳本(與目前日期無關)
我不想“刪除超過 X 天的文件”。如果我想這樣做,我會從已經為此目的編寫的數千個腳本中挑選一個,我不會費心在 ServerFault 上問這樣一個微不足道的問題。
我確實想刪除特定文件夾中除了最近的 N 個文件之外的所有文件。
背景:遠端系統配置為將定期存檔文件轉儲到 Windows 伺服器上的共享中。這些文件的命名約定為 YYYYMMDD-hhmm.ext。如果存檔過程失敗,我不希望清除腳本僅僅因為文件超過這麼多天而刪除文件。無法將遠端系統配置為在歸檔過程中清除文件。
因此,例如,當腳本執行時,可能有 10 個文件,可能有 7 個文件,文件夾中可能有 5 個文件。我需要始終至少保留最近的 5 個,無論它們多大。
這可以用 PowerShell 完成嗎?
編輯:最好忽略與命名約定不匹配的文件或文件夾。不應刪除其他文件和文件夾,也不應混淆腳本(導致保留少於 5 個存檔文件)。
用法:yourScript.ps1 -Path path\to\run\against
$$ -NumberToSave N $$
param([String]$Path,[Int32]$NumberToSave=5) $items = Get-ChildItem "$Path\*.ext" | Where-Object Name -match "\d\d\d\d\d\d\d\d-\d\d\d\d\.ext" | Sort-Object Name -Descending if ($NumberToSave -lt $items.Count) { $items[$NumberToSave..($items.Count-1)] | Remove-Item }
我不認為這真的比@John 的更好,我只是為了嘗試參數、正則表達式而不是使用循環。進行正則表達式匹配確實有可能排除其他與格式不匹配的 .ext 文件(例如 20130504-1200.txt.ext、20.ext),但它是否適用是值得懷疑的。
我很沮喪地發現如果 $ NumberToSave = $ items.Count 則需要 if 語句,否則將不存在。技術上:
$items[$numberToSave..$items.Count] | Remove-Item
工作正常(如果您引用超過數組邊界,PowerShell 似乎不會出錯,它只是處理並忽略它?)但這似乎可能令人困惑。