You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用批处理脚本备份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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:50:19