使用batch file自动创build5个运行迭代的备份文件

我正在寻找一般的build议,如果这是可能的/最好的方式去做。

我有一个拆分Access数据库。 后端文件被称为data.mdb。 在与data.mdb相同的目录下,我想放置一个.bat文件,它会自动每晚创build一个data.mdb的副本。 但是,我不想创造无限的备份。 我只想要一个最新的5个运行列表。 也就是说,在第五晚之后,每个后续备份应该覆盖copy-data.mdb的5个版本中最早的一个。

是否有可能用batch file做到这一点,你能给我举例说明代码的样子吗?

我假设我将不得不改变Windows设置 – 也许在msconfig中 – 使.bat自动运行在特定的时间。 有没有办法在.bat本身内做到这一点。 我的直觉说没有,但这是理想的。

如果你认为有更好的方法来获得同样的结果,我会对你的想法感兴趣。 谢谢!

以下批处理文件可用于此任务:

@echo off set "BackupFolder=Backup" for /F "tokens=2 delims==" %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "FileDate=%%I" set "FileDate=%FileDate:~0,4%-%FileDate:~4,2%-%FileDate:~6,2%" md "%BackupFolder%" 2>nul copy /Y "data.mdb" "%BackupFolder%\data_%FileDate%.mdb" >nul for /F "skip=5 delims=" %%I in ('dir /B /ON "%BackupFolder%\data_*.mdb" 2^>nul') do del "%BackupFolder%\%%I" 

WMIC命令输出当前的本地日期和时间,例如:

 LocalDateTime=20170410074206.062000+120 

只是等号后面的字符串是感兴趣的,并通过第一个FOR循环分配给变量FileDate

从这个字符串只有年,月和日是备份文件的文件名称的利益。 因此,第四个命令行使用字符串替换来获取格式YYYY-MM-DD的本地日期。 例如,最终分配给环境变量FileDate的字符串是:

 2017-04-10 

一个COPY是由data.mdb组成的,如果不是已经存在的话,那么这个备份文件夹总是被创建一个下划线和FileDate值作为文件名。 在批处理文件中,文件data.mdb应该使用完整路径指定,第二行中定义的备份文件夹应该使用完整路径指定,而不仅限于Backup 。 作为计划任务运行批处理文件后,这很重要。

然后执行命令DIR,以裸格式列出备份目录中的所有data_*.mdb文件,因为/B由于/ON按照相反的顺序按字母顺序排序。 结果是例如:

 data_2017-04-10.mdb data_2017-04-07.mdb data_2017-04-06.mdb data_2017-04-05.mdb data_2017-04-04.mdb data_2017-04-03.mdb 

前5行是5个最新的文件在FOR循环处理这个输出时被跳过。 所有其他文件通常只有一个文件被删除,最老的文件根据文件名中的日期。

在Windows任务计划程序中配置执行此批处理文件的计划任务,例如,周一至周五晚上23:45。 默认情况下,按计划任务执行批处理文件的当前目录是%SystemRoot%\System32而不是批处理文件的目录,这就是为什么建议在批处理文件中指定具有完整路径的备份文件夹和文件data.mdb的原因。

在执行批处理文件时,使用data.mdb的数据库应用程序不运行是非常重要的,否则文件复制最有可能失败,因为数据库应用程序通常以独占模式打开数据库文件,即没有其他应用程序可以读/写文件打开数据库应用程序。

为了理解使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • copy /?
  • del /?
  • echo /?
  • for /?
  • set /?
  • wmic /?
  • wmic OS /?
  • wmic OS GET /?

另请阅读Microsoft有关使用命令重定向操作符的文章,了解如果备份文件夹已存在,则使用2>nul来抑制由MD输出的错误消息;如果当前没有文件data_*.mdb ,的手动删除。 重定向操作符>必须在插入符号字符^ FOR命令行中被转义为在解析FOR命令行时被解释为文字字符,而在后台的单独命令过程中作为重定向操作符后面的执行DIR命令。