[英]Delete all file and keep the latest using powershell
我有一個每天備份的文件,示例如下:
在刪除除最新之外的所有內容之前:
Folder C:\Backup\
File :
Backup1-Database-A.bak | 1/10/2020 1:24 PM
Backup2-Database-A.bak | 2/10/2020 1:24 PM
Backup1-Database-B.bak | 1/10/2020 1:24 PM
Backup2-Database-B.bak | 2/10/2020 1:24 PM
Backup2-Database-B.bak | 3/10/2020 1:24 PM
刪除除最新之外的所有內容后所需的狀態:
Folder C:\Backup\
File :
Backup2-Database-A.bak | 2/10/2020 1:24 PM
Backup2-Database-B.bak | 3/10/2020 1:24 PM
如何保留每個數據庫的最新文件?
我正在使用此腳本,但它刪除了所有.bak
因此數據庫 A 的備份消失了,但我想保留每個數據庫的最新版本。
$mydays = (Get-Date).AddDays(-7)
$path = "C:\Backup\"
Get-Childitem -path $path -recurse -force | Where-Object { !$_.PSIsContainer -and $_.name -like "*.bak" -and $_.LastWriteTime -lt $mydays} | Remove-Item -Force
正如Lee_Daily 所建議的那樣,與其使用時間窗口進行過濾,不如按上次寫入時間對文件進行排序並刪除除最新文件之外的所有文件更簡單。
挑戰在於確定哪些文件與同一數據庫相關,因此應將其視為一個組,以便在每個組中保留最新的備份。
下面的代碼使用以下方法:
Group-Object
cmdlet 允許您按指示數據庫的文件名的共享部分對輸入文件進行分組。
{ $_.Name -replace '^Backup\\d+-' }
傳遞給Group-Object
使用基於正則表達式的-replace
運算符,使其通過指示源數據庫的共享名稱部分對輸入文件對象進行分組,通過刪除'Backup<n>-'
前綴。'Backup1-Database-A.bak'
和'Backup2-Database-A.bak'
的結果只是'Database-A.bak'
,所以這兩個文件被組合在一起。 然后可以按降序對每個結果組中的文件按上次寫入時間排序,使用
Sort-Object
。
您可以使用Select-Object
-Skip 1
從輸出中排除第一個(因此也是最新的)文件。
生成的文件 - 除了每個數據庫的最新文件之外的所有文件 - 然后可以發送到Remove-Item
。
$path = 'C:\Backup'
Get-Childitem -Path $path -Recurse -Force -File -Filter *.bak |
Group-Object { $_.Name -replace '^Backup\d+-' } |
ForEach-Object {
$_.Group | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 |
Remove-Item -Force -Whatif
}
注意:上面命令中的-WhatIf
常用參數預覽操作。 一旦您確定操作會執行您想要的操作,請刪除-WhatIf
。
還要注意的初始文件選擇的簡化: -File
(PSv3 +)限制輸出到文件只(未也目錄),和-Filter *.bak
是由文件擴展名以高效的方式進行篩選。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.