Navicat备份清理应优先用forfiles按最后修改时间删除,简单可靠;若mtime失真则用PowerShell解析文件名日期。forfiles /p "D:\navicat_backups" /d -7 /c "cmd /c del @path"可删7天前文件,PowerShell脚本需匹配如_(\d{8})_\d{6}.sql格式并校验日期。
Navicat备份文件命名规律决定清理逻辑
navicat默认生成的备份文件名含时间戳,比如 mydb_20240520143022.sql 或 mydb_2024-05-20_14-30-22.zip。关键不是后缀,而是日期部分是否可被 forfiles 或 powershell 识别——windows 自带的 forfiles 只认文件“最后修改时间”,不解析文件名里的日期;所以如果你靠文件名里的时间判断“过期”,必须用 powershell;如果只按备份生成后过了几天就删,forfiles 更轻量、无需额外环境。
用 forfiles 按最后修改时间删,最简可靠
这是多数人真正需要的方案:备份脚本执行完立刻 touch 文件(或 Navicat 本身写完就改 mtime),那文件最后修改时间 ≈ 备份完成时间。直接按天数清理即可,稳定、无依赖、一行命令搞定。
-
forfiles /p "D:\navicat_backups" /s /d -7 /c "cmd /c del @path"—— 删除D:\navicat_backups下所有 7 天前修改的文件(含子目录) - 加
/m *.sql限定只删 SQL 文件:forfiles /p "D:\navicat_backups" /m *.sql /d -7 /c "cmd /c del @path" - 先预览不真删:
forfiles /p "D:\navicat_backups" /d -7 /c "cmd /c echo @path",确认路径和文件无误再换del - 注意:
/d -7表示“早于 7 天前”,即保留最近 7 天(含当天)的文件;若要保留最近 30 个文件,forfiles不支持,得换 PowerShell
PowerShell 按文件名日期删,适合命名规范但 mtime 不可信的场景
某些情况下,Navicat 备份后又被其他工具移动/解压/重命名,导致文件最后修改时间失真。此时必须从文件名提取日期,比如 project_20240520_023015.sql 中的 20240520。PowerShell 能正则匹配并转成日期对象比对。
Get-ChildItem "D:\navicat_backups\*.sql" | ForEach-Object {
if ($_ -match '_(\d{8})_\d{6}\.sql$') {
$date = [datetime]::ParseExact($matches[1], 'yyyyMMdd', $null)
if ((Get-Date) -gt $date.AddDays(7)) {
Remove-Item $_.FullName -Force
}
}
}
要点:
- 正则
_(\d{8})_\d{6}\.sql$匹配下划线+8位日期+下划线+6位时间+.sql,根据你实际命名调整,比如用-分隔就改成-(\d{4}-\d{2}-\d{2})- - 没匹配上的文件会被跳过,不会误删
- PowerShell 脚本保存为
cleanup_navicat.ps1后,需在管理员权限下运行,或先执行Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
批处理调用与计划任务配置要点
别把清理逻辑硬塞进 Navicat 的“执行后运行命令”里——它不等备份完成就可能触发,也不传参,极难调试。正确做法是:独立写好清理脚本,再用 Windows 计划任务每天固定时间跑一次。
- 批处理(
cleanup.bat)只需一句:powershell -ExecutionPolicy Bypass -File "D:\scripts\cleanup_navicat.ps1"(调用 PowerShell 脚本)或直接写forfiles命令 - 计划任务中,“触发器”选“每天”,“操作”选“启动程序”,程序填
cmd.exe,参数填/c "D:\scripts\cleanup.bat" - 务必勾选“使用最高权限运行”,否则可能因权限不足跳过某些文件
- 测试时先手动双击运行批处理,看控制台是否报错、是否删了预期文件——别等一周后才发现删错了
真正容易出问题的是路径空格和中文,所有含空格的路径必须用英文双引号包裹,比如 "D:\My Backups";而 PowerShell 里路径变量不用引号反而更稳,直接写 $path = "D:\My Backups" 就行。











