自动定期压缩备份目录的脚本,以windows批处理实现

需求描述

Windows 下,有时要频繁的对一个目录做备份,这个目录并不大(比如几个或十几个小文件,1MB以下),只在需要的时候才监测并做定期备份,与上次备份以来没有修改则不备份。

一个实际场景是,某些单机游戏,游戏本身会自动保存数据,万一某一步手抖误操作,想退回以前存档,结果发现很长时间没有手工存档,那么这期间的时间就浪费了。如果自动把存档目录备份起来,就可以方便的回退到最合理的历史时间点。

分析与实现

windows本身的卷影复制、第三方自动备份程序、同步备份到远程服务器,等很多方案都可以实现。只是,安装个庞大的程序显得小题大作,这里希望使用尽量简单的工具实现,于是选用批处理脚本的方案,需要监测目录并做备份的时候,就启动该脚本,不需要时就关掉。

脚本 start_auto_backup.bat

用法

前提条件,安装好 7zip,脚本需要调用它。

把脚本放在任何目录下都可以,修改其中的配置项:7zip 的安装路径、待备份的源文件夹、存储到的目标文件夹、运行间隔时间秒数等,如下所示

:: ========== 可修改的配置参数 ==========
:: 设置 7-Zip 路径(请确保 7z.exe 存在)
set sevenzip="C:\Program Files\7-Zip\7z.exe"
:: 设置源文件夹和备份目标文件夹,结尾不要带 \
set source_folder=G:\tmp\abk\dfNw2TD7x
set backup_folder=G:\tmp\abk\_backup

:: 设置间隔时间(单位:秒)
set interval=60
:: 是否启用 HASH 校验(1=开启,0=关闭)
set ENABLE_HASH_CHECK=1
:: 是否显示 7-Zip 输出(1=显示,0=隐藏)
set SHOW_7ZIP_OUTPUT=0

然后双击运行即可,不需要监测备份的时候随时关掉就行。

附记

事实这个脚本就是来源于玩游戏时的念头,google一下没有找到合适的工具,询问 chatGPT 推荐的相关程序也并不合适的,但也推荐了一段powershell脚本,因为不懂并且不愿意学习powershell,于是试着让 chatGPT 再生成一段批处理脚本,竟然是能正确备份压缩的。这个时候的需求还是最简单的定时压缩备份,并没有考虑检测文件修改,于是给chatGPT增加需求,结果脚本也还是是能运行的。

次日,想再完善一下根据文件修改时间检测的逻辑,希望,如果有任何文件修改、或上次备份以来有文件被修改,才做备份。但,几经修改需求描述,包括开新会话,chatGPT都无法写出能运行的脚本。于是在做了一些手工调试,并且发现了,前面的脚本是错的,即使有文件修改,也不能检测发现。两种判断的逻辑,也总错的。最终放弃了。

然后,转为花时间研究批处理脚本的规则,并做深入的调试,终于写出前面脚本。期间发现了批处理实在是坑,布满了陷阱。比如变量延迟扩展,变量名应该使用感叹号括起来,而不是百分号,chatGPT生成的脚本没有发现文件修改,就错在这里。但,在拼接时间字符串时,写法却是对的。另外,chatGPT 生成的脚本使用 certutil 逐文件计算 hash 值,再通过 findstr 过滤出hash值的一行重定向写入文件,考虑到已经使用 7zip 做压缩,那么计算文件 hash 值也交给它做,还免去遍历目录的麻烦。还有,根据文件修改时间做检测,实际上没有意义,放弃了。这就是前面的脚本。

即使如此,chatGPT 生成的脚本仍旧是有用的底稿,值得称赞。

Last Updated on 2025/03/06

发表评论

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理