# 起因

最近一段时间不断重装电脑,虽然留了心眼备份文件,但还是造成了部分数据永久丢失,那还是我之前测运行时间测了一个月的数据啊,期间电脑莫名挂了几次,如果是之前丢图我还是能接受的,唉,说多了都是泪。

# 设计需求

  1. 能自动备份并压缩文件
  2. 自动检测几天之前的备份文件,若存在删除,否则不做处理

# 压缩文件目录要求

C:/STORAGE/Backup
`-- 2022-07-09
    |-- Blender.zip
    |-- Blog.zip
    |-- Code.zip
    `-- Pictures.zip
`-- 2022-07-10
    |-- Blender.zip
    |-- Blog.zip
    |-- Code.zip
    `-- Pictures.zip
    .....

# 设计实现

最好不要有中文,哪怕是中文注释程序照样给我崩溃

  1. 找到自己电脑 Bandizip 所在的路径,我使用的是 bz.exe
@REM rem Set the path to bz.exe
set bz=C:\SOFEWARE\Bandizip\bz.exe

当然你也可以用 WinRAR 7Zip 其他主流压缩软件,这两家好像解决方案更丰富些,而我则用了 bz.exe, 但 Bandizip 官网命令行更多的支持是 Bandizip.exe, 我是憨批。

  1. 获取电脑系统时间
@REM rem Get the current backup time
set YYYYmmdd=%date:~0,4%-%date:~5,2%-%date:~8,2%

bat 文件中很经典的一句命令,其中 date 和 time 是 Windows 系统的环境变量,可以直接取得系统时间,而我只需要 date。

  1. 设置需备份的文件路径
@REM rem set the path to source folder
set Code=C:\STORAGE\Code
set Blog=C:\Blog
set Pictures=C:\STORAGE\Pictures
set Blender=C:\STORAGE\Blender
  1. 设置备份的文件路径
@REM rem set the path to target folder
set targetPath=C:\STORAGE\Backup\%YYYYmmdd%\
  1. 设置要检测文件删除的文件路径
@REM Set the file path to search
set originalPath=C:\STORAGE\Backup\
  1. 开始备份
@REM start backup 
%bz% c -aoa -y -fmt:zip "%targetPath%Code" "%Code%"
%bz% c -aoa -y -fmt:zip "%targetPath%Blog" "%Blog%"
%bz% c -aoa -y -fmt:zip "%targetPath%Pictures" "%Pictures%"
%bz% c -aoa -y -fmt:zip "%targetPath%Blender" "%Blender%"

bz 命令的常规格式如下:

bz.exe <command> [<switches>...] <archive> [<files>...] [<path_to_extract>]

头疼对吧,那就对了,推荐去官网瞅一眼参数后直接对着后面的例子做就行了。c 是创建一个文件 (新文件名不知道),-aoa 表示有同名文件则覆盖该文件,-y 表示任务完成后关闭窗口 (对于控制台应用貌似没用),-fmt:zip 表示创建的新文件拓展名,"%targetPath%Code" 表示创建的新文件名字和压缩路径,"%Code%" 表示要备份的文件路径。

  1. 删除 3 天之前的备份
echo %originalPath%
@REM Delete backups folders older than 3 days
forfiles /P "%originalPath%\" /S /M *.* /D -3 /C "cmd /c del /s/q @path"
for /f "delims=" %%a in ('dir /ad /b /s "%originalPath%"^|sort /r') do (
   echo %%a
   rd "%%a">nul 2>nul && echo empty folder "%%a" delete sucessfully!
)

forfiles 命令推荐直接去官网看或直接在 windows terminal 输入 forfiles /? 看,详细的很 (大概), 还有例子。

注意不要漏了 "% originalPath%\" 那个 \, 没了这个直接给你报个无效参数的错,另外如果是文件夹删除推荐用 rd 命令,文件删除用 del 命令,否则要加个删除空文件夹的代码,那个贼麻烦,还有 /q/s 是配合 rd 用的,缺一不可。

结果我最后还是用来最麻烦的方法,还加了管理员运行,不仅因为我只有一个 C 盘,更重要的删除空文件夹这个命令只能以管理员身份运行。

# 加入 windows 定时任务

  1. 打开 cmd, 输入 taskschd.msc 进入任务计划程序面板
  2. 创建基本任务,设置好名称、触发器、操作
  3. 添加 backup.dat 路径至你的定时任务中
  4. 改变定时任务属性, 用户选为 SYSTEM, 安全选项选不管用户是否登录都要运行和勾选最高权限运行,操作步骤如下图:
设置后台静默运行
第四步不设置每次运行就会弹出cmd窗口,那么我想要的后台静默运行效果就没了。

完整源代码戳此

# 参考

bat 批处理教程
window bat 备份文件与删除文件
Bandizip 命令行参数
Windows 自动压缩文件夹,备份并上传到网盘
用 bat 批处理程序通过 DOS 命令行删除所有的空文件夹
让 bat 文件自动以管理员身份运行

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Jelly27th 微信支付

微信支付

Jelly27th 支付宝

支付宝