Quản lý tệp sao lưu PowerShell của tôi
Tháng trước tôi đã bắt đầu một dự án sao lưu các thư mục quan trọng. Quá trình sao lưu này không gì khác hơn là một tùy chọn khôi phục khác nếu tôi cần. Tuy nhiên, nó đã chạy được hơn một tháng và hiện tại tôi đã có một số tệp sao lưu đầy đủ. Tôi không cần phải giữ tất cả chúng. Nếu tôi giữ lại 4 bản sao lưu đầy đủ gần đây nhất thì thế là đủ. Đây là cách tôi quản lý quy trình này bằng PowerShell.
Khi tôi tạo một tệp sao lưu đầy đủ, nó sẽ được sao chép vào một thư mục chia sẻ trên thiết bị NAS Synology của tôi. Đây là những gì tôi có bây giờ.
Nếu bạn nhớ lại, mỗi tên tệp bao gồm những gì về cơ bản là một mô tả đã định sẵn; Tập lệnh và Dropbox chẳng hạn. Thật dễ dàng để sắp xếp các tập tin vào lần ghi cuối cùng và sau đó xóa tương ứng. Tôi có 5 bộ và có thể chạy bộ này:
Get-childitem -Path "\\ds416\backup\20*-full.rar" |
Sort-Object -Property LastWriteTime -Descending |
Select-Object -Skip 20
Tôi đây phải là những tập tin cũ nhất mà tôi có thể xóa. Tuy nhiên, tôi không muốn đưa ra bất kỳ giả định nào. Điều gì sẽ xảy ra nếu bản sao lưu đầy đủ không hoàn thành sau một tuần hoặc tôi đã tự mình chạy bản sao lưu đầy đủ bổ sung? Tôi cần một cách tiếp cận phức tạp hơn. Hãy bắt đầu lại.
Đầu tiên, lấy tất cả các tập tin sao lưu.
$files = Get-ChildItem -Path "\\ds416\backup\20*-full.rar" -file
Tiếp theo, bằng cách sử dụng mẫu biểu thức chính quy để trích xuất tên bộ sao lưu, tôi nhóm các tệp.
$grouped = $files | Group-Object -property { ([regex]"(?<=_)\w+(?=-)").match($_.BaseName).value }
Biểu thức chính quy đang tìm kiếm văn bản đứng trước _ và theo sau là -. Đây là những cái nhìn phía sau và cái nhìn phía trước.
Bây giờ tôi có thể xử lý từng nhóm, sắp xếp các tệp và xóa những tệp cũ nhất.
foreach ($item in $grouped) {
$item.group | Sort-Object -property LastWriteTime -descending | Select-Object -skip 4 | Remove-Item -WhatIf
}
Đây là tập lệnh PowerShell cắt bản sao lưu hoàn chỉnh của tôi.
#MyBackupTrim.ps1
#trim full backups to the last X number of files
[cmdletbinding(SupportsShouldProcess)]
Param(
[Parameter(Position = 0, HelpMessage = "Specify the backup folder location")]
[ValidateNotNullOrEmpty()]
[ValidateScript({Test-Path $_ })]
[string]$Path = "\\ds416\backup",
[Parameter(HelpMessage = "Specify a file pattern")]
[ValidateNotNullOrEmpty()]
[string]$Pattern = "*-FULL.rar",
[Parameter(HelpMessage = "Specify the number of the most recent files to keep")]
[Validatescript({ $_ -ge 1 })]
[int]$Count = 4
)
$find = Join-Path -Path $path -ChildPath $pattern
Write-Verbose "Finding backup files from $Find"
Try {
$files = Get-ChildItem -Path $find -file -ErrorAction Stop
}
Catch {
Throw $_
}
if ($files.count -gt 0) {
Write-Verbose "Found $($files.count) backup files"
# group the files based on the naming convention
# like 20191108_documents-FULL.rar and 20191108_Scripts-FULL.rar
# but make sure there are at least $Count number of files
$grouped = $files | Group-Object -property { ([regex]"(?<=_)\w+(?=-)").match($_.BaseName).value } | Where-Object { $_.count -gt $count}
if ($grouped) {
foreach ($item in $grouped) {
Write-Verbose "Trimming $($item.name)"
$item.group | Sort-Object -property LastWriteTime -descending | Select-Object -skip $count | Remove-Item
}
}
else {
Write-Host "Not enough files to justify cleanup." -ForegroundColor magenta
}
}
#End of script
Tôi có thể thêm tập lệnh này vào cuối tập lệnh sao lưu hàng tuần của mình và cắt bỏ các tệp cũ. Tôi có thể kiểm tra định kỳ các thư mục sao lưu của mình theo cách thủ công để xác minh rằng tôi chỉ giữ những gì tôi thực sự cần. Nếu không, tôi có thể quay lại và để PowerShell thực hiện công việc của mình cho tôi.