Scripting

用於刪除最舊文件的 Powershell 腳本(與目前日期無關)

  • January 28, 2022

不想“刪除超過 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 似乎不會出錯,它只是處理並忽略它?)但這似乎可能令人困惑。

引用自:https://serverfault.com/questions/526323