如何用批处理脚本备份NAS上的Access Db并保留最近n个版本?
解决Access DB备份脚本的两个核心问题
问题1:Robocopy复制后文件修改日期不变,导致forfiles无法识别新老备份
这是Robocopy的默认特性——它会完整保留源文件的时间戳(包括创建、修改时间),所以复制到目标服务器的文件和NAS上的源文件时间完全一致,自然没法用forfiles按天数区分。
解决办法有两种,推荐第二种更稳妥:
- 改用
copy命令替代Robocopy:
直接用copy /Y "\\NAS路径\你的数据库.accdb" "\\目标服务器\备份文件夹\数据库_备份_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%.accdb"
这个命令会自动将目标文件的修改时间设为当前执行时间,同时给备份文件加上时间戳命名(比如数据库_备份_20240520_1430.accdb),后续不管是识别还是清理都更直观。 - 如果非要用Robocopy:
加上/COPY:DA参数(只复制数据和属性,不复制时间戳),这样目标文件的修改时间会更新为当前时间。不过还是建议给备份文件加时间戳,避免重名问题。
问题2:如何保留最近n个备份文件(而非按天数)
Forfiles确实只支持按时间范围删除,要实现“保留固定数量最新文件”的需求,可以用批处理的for循环结合排序来搞定,具体脚本片段如下:
@echo off setlocal enabledelayedexpansion :: 配置要保留的备份数量 set "keep_count=5" set "backup_path=\\目标服务器\备份文件夹" :: 按修改时间从新到旧列出所有备份文件,跳过前keep_count个,删除剩余的 set "count=0" for /f "delims=" %%f in ('dir /b /o-d /a-d "%backup_path%\数据库_备份_*.accdb"') do ( set /a count+=1 if !count! gtr %keep_count% ( echo 删除旧备份:"%%f" del /f /q "%backup_path%\%%f" ) ) endlocal
关键说明:
dir /b /o-d /a-d:/b只输出文件名,/o-d按修改时间倒序排列(最新的在前),/a-d排除文件夹,只处理文件。enabledelayedexpansion:必须开启这个特性,才能在循环中正确更新和读取count变量的值。
完整的备份+清理脚本示例
把上面的内容整合起来,就是一个可以直接用的脚本,还加入了错误判断:
@echo off setlocal enabledelayedexpansion :: -------------------------- 配置参数 -------------------------- set "source_db=\\NAS服务器路径\你的数据库.accdb" set "backup_folder=\\目标服务器路径\备份文件夹" set "keep_count=5" :: 要保留的最新备份数量 :: ------------------------------------------------------------- :: 生成带时间戳的备份文件名(避免重名,同时处理凌晨小时数的前导空格) set "year=%date:~0,4%" set "month=%date:~5,2%" set "day=%date:~8,2%" set "hour=%time:~0,2%" set "minute=%time:~3,2%" if "%hour:~0,1%"==" " set "hour=0%hour:~1,1%" set "backup_file=数据库_备份_%year%%month%%day%_%hour%%minute%.accdb" :: 执行备份 echo 正在备份数据库... copy /Y "%source_db%" "%backup_folder%\%backup_file%" if errorlevel 1 ( echo 备份失败!请检查路径和权限。 exit /b 1 ) echo 备份成功:%backup_folder%\%backup_file% :: 清理旧备份 echo 开始清理旧备份,将保留最近%keep_count%个... set "count=0" for /f "delims=" %%f in ('dir /b /o-d /a-d "%backup_folder%\数据库_备份_*.accdb"') do ( set /a count+=1 if !count! gtr %keep_count% ( echo 删除:"%%f" del /f /q "%backup_folder%\%%f" ) ) echo 清理完成! endlocal
额外提示:
- 时间戳的截取参数可能需要根据你的系统区域设置调整(比如如果日期格式是
dd/MM/yyyy,要修改%date%的截取位置)。 - 把脚本加入Windows任务计划,设置每日执行两次即可自动运行。
内容的提问来源于stack exchange,提问作者Chico3001
相关产品推荐
相关产品推荐

