使用批处理文件自动创建具有5个正在运行的迭代的备份文件

时间:2017-04-08 15:39:42

标签: windows batch-file

我正在寻找关于这是否可能/最佳方式的一般建议。

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

是否可以使用批处理文件执行此操作,您能否举例说明代码的外观?

我假设我必须以某种方式改变Windows设置 - 可能是在msconfig中 - 以使.bat在特定时间自动运行。有没有办法在.bat本身内执行此操作。我的直觉说不,但这将是理想的。

如果您认为有更好的方法可以获得相同的结果,我会对您的想法感兴趣。谢谢!

1 个答案:

答案 0 :(得分:1)

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

@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 /O-N "%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由于/O-N而按字母顺序按字母顺序排序。结果是例如:

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

通过 FOR 循环处理此输出时,将跳过前5行作为5个最新文件。删除所有其他文件,通常只有一个文件,最旧的文件根据文件名中的日期。

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

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

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

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

另请阅读Microsoft文章Using Command Redirection Operators,了解2>nul用于抑制 MD 输出的错误消息的说明(如果备份文件夹已存在)和 DIR 如果备份目录中当前没有文件data_*.mdb,例如由于手动删除。必须在 FOR 命令行中使用插入符>对重定向运算符^进行转义,以便在解析 FOR 命令行时将其解释为文字字符,但作为重定向操作符,稍后在后台单独的命令进程中由 FOR 执行 DIR 命令。