如何用PowerShell按设施保留最近3份SQL备份并自动清理?
修正后的PowerShell脚本(按设施分组保留最近3份备份)
针对你的需求,需要按设施标识对备份文件分组后再保留每组的最近3份,以下是修正后的脚本:
$RCDestination = "\\computername\folder" # 匹配符合命名规则的SQL备份文件 $filePattern = "Backup_DB_Facility_*.bak" # 1. 获取目标文件夹中符合规则的所有备份文件 # 2. 按设施名称拆分分组(从文件名提取第4个下划线分隔的字段) # 3. 每组内按文件名排序,保留最后3份,删除其余文件 Get-ChildItem -Path $RCDestination -Filter $filePattern -File | Group-Object -Property { $_.Name.Split('_')[3] } | ForEach-Object { # 若当前设施的备份文件≤3份,不执行删除;否则删除超出的旧文件 if ($_.Group.Count -gt 3) { $_.Group | Sort-Object -Property Name | Select-Object -Skip ($_.Group.Count - 3) | Remove-Item -Force } }
关键修改说明
- 精准过滤文件:用
-Filter $filePattern直接筛选目标备份文件,-File参数自动排除文件夹,替代原脚本中低效的where判断。 - 按设施分组:通过
Group-Object和文件名拆分$_.Name.Split('_')[3],将同一设施的备份文件归为一组(比如所有AAAA的文件会被分到同一组)。 - 分组内保留最近3份:每组文件按文件名排序(文件名中的日期段保证字典序与时间顺序一致),仅删除超出3份的旧文件;若某设施备份不足3份,自动全部保留。
原脚本问题分析
- 未按设施分组:原脚本将所有文件全局排序后跳过3个,导致仅保留排序最靠后的3个文件(均为同一设施),其他设施的备份被全部删除。
- 无效过滤条件:
($FileName -like "$FileName")是恒成立的无效判断,无法筛选目标文件。
Task Scheduler 配置建议
将脚本保存为RollingBackupCleanup.ps1,在任务计划程序中创建任务:
- 触发器:设置为每日触发(根据你的滚动保留3天需求,可调整为每日凌晨执行)
- 操作:选择「启动程序」,程序/脚本填
powershell.exe,添加参数:
(-ExecutionPolicy Bypass -File "C:\Scripts\RollingBackupCleanup.ps1"-ExecutionPolicy Bypass用于绕过PowerShell的脚本执行限制,确保脚本能正常运行)
内容的提问来源于stack exchange,提问作者keio9
相关产品推荐
相关产品推荐

