# --- 設定區 (請修改這裡) --- $User = "root" # VPS 使用者 $HostName = "xxx" # VPS IP $RemotePath = "xxx" # VPS 上要備份的資料夾或檔案 $LocalBackupRoot = "D:\Backups" # Windows 本地存放備份的根目錄 $SshKeyPath = "$env:USERPROFILE\.ssh\id_ed25519" # SSH 私鑰路徑 # --- 程式邏輯區 (建議勿動) --- $DateStr = Get-Date -Format "yyyy-MM-dd" $TargetDir = Join-Path $LocalBackupRoot $DateStr # 1. 建立當日備份資料夾 if (-not (Test-Path $TargetDir)) { New-Item -Path $TargetDir -ItemType Directory | Out-Null } Write-Host "正在從 VPS 下載備份..." -ForegroundColor Cyan # 使用 scp 下載 (-r 代表遞迴複製資料夾, -i 指定金鑰, -q 靜默模式) # 如果 OpenSSH 未安裝,需先在 Windows「選用功能」中安裝 scp -r -i $SshKeyPath "$($User)@$($HostName):$RemotePath" $TargetDir if ($LASTEXITCODE -eq 0) { Write-Host "備份成功:$TargetDir" -ForegroundColor Green } else { Write-Host "備份失敗,請檢查連線或路徑" -ForegroundColor Red Exit } # 2. 執行保留策略 (Retention Policy) # 策略: # - 過去 7 天內的備份:全部保留 # - 每週的備份 (這裡設定為星期一):永久保留 (或可自行設定保留多久) # - 每月的備份 (這裡設定為 1 號):永久保留 # - 其他:刪除 Write-Host "正在清理舊備份..." -ForegroundColor Yellow $BackupFolders = Get-ChildItem -Path $LocalBackupRoot | Where-Object { $_.PSIsContainer } foreach ($Folder in $BackupFolders) { # 嘗試從資料夾名稱解析日期 (假設資料夾名就是 yyyy-MM-dd) try { $FolderDate = [DateTime]::ParseExact($Folder.Name, "yyyy-MM-dd", $null) $DaysOld = (Get-Date).Date - $FolderDate.Date # 判斷是否保留 $Keep = $false $Reason = "" if ($DaysOld.TotalDays -lt 30) { $Keep = $true $Reason = "30天內近端備份" } elseif ($FolderDate.Day -eq 1) { $Keep = $true $Reason = "每月1號備份" } elseif ($FolderDate.DayOfWeek -eq [DayOfWeek]::Monday) { $Keep = $true $Reason = "每週一備份" } # 執行刪除或保留 if (-not $Keep) { Write-Host "刪除:$($Folder.Name) (超過30天且非週/月備份)" -ForegroundColor DarkGray Remove-Item -Path $Folder.FullName -Recurse -Force } else { Write-Host "保留:$($Folder.Name) ($Reason)" -ForegroundColor Gray } } catch { Write-Host "跳過:$($Folder.Name) (非日期命名格式)" -ForegroundColor White } } Write-Host "作業完成。" -ForegroundColor Green