我正在寻找关于这是否可能/最佳方式的一般建议。
我有一个拆分Access数据库。后端文件名为data.mdb。在与data.mdb相同的目录中,我想放置一个.bat,它将每晚自动创建data.mdb的副本。但是,我不想创建无限备份。我只想要一个最新的5个运行列表。也就是说,在第5晚之后,每个后续备份都应该覆盖5个版本的复制中最旧的 - data.mdb。
是否可以使用批处理文件执行此操作,您能否举例说明代码的外观?
我假设我必须以某种方式改变Windows设置 - 可能是在msconfig中 - 以使.bat在特定时间自动运行。有没有办法在.bat本身内执行此操作。我的直觉说不,但这将是理想的。
如果您认为有更好的方法可以获得相同的结果,我会对您的想法感兴趣。谢谢!
答案 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 命令。