Svn备份与Bandizip压缩批处理程序
目的:为了定时备份多个svn仓库数据,使用批处理程序进行备份并Bandizip进行压缩保存到指定位置,操作完成后弹出成功提示。
为了完成以上目标,需要了解以下几个方面:
- 批处理命令
- Svn命令
- Bandizip命令
1. 批处理命令
echo 命令
打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo命令将显示当前回显设置。
语法
echo [{on|off}] [message]
示例:
@echo off / echo hello world
rem 命令
注释命令,类似于在C语言中的/--------/,它并不会被执行,只是起一个注释的作用,只有在编辑批处理时才会被看到,主要用于方便修改。
:: 也具有rem的功能,但::和rem还是有区别的。当关闭回显时,rem和::后的内容都不会显示;当打开回显时,rem后的内容会显示出来,然而::后的内容仍然不会显示。
语法
Rem [注释内容]
示例:
Rem 你好。
pause 命令
暂停命令。运行 Pause 命令时,将显示下面的消息:
Press any key to continue. . .(或:请按任意键继续. . .)
示例:
@echo off
:begin
copy G:*.* d:\back
echo 请插入另一张光盘...
pause
goto begin
start 命令
调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。如:startcalc.exe即可打开Windows的计算器。
常用参数:
MIN 开始时窗口最小化
SEPARATE 在分开的空间内开始 16 位 Windows 程序
HIGH 在 HIGH 优先级类别开始应用程序
REALTIME 在 REALTIME 优先级类别开始应用程序
WAIT 启动应用程序并等候它结束
parameters 这些为传送到命令/程序的参数
执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用程序终止就返回命令提示。如果在命令脚本内执行,该新行为则不会发生。
set 命令
显示、设置或删除变量。
- 显示变量:set 或 set s 前者显示批处理当前已定义的所有变量及其值,后者显示所有以s开头的变量及值。
- 设置和调用变量:例如set aa=abcd,就是把aa定义为abcd。如果要调用这个变量,就把aa两边加上个百分号。
- 删除变量:set aa= 此句命令即可删除变量aa。若变量aa已被定义,则删除变量aa;若aa尚未定义,则此句命令无实质意义。
例如:
set aa=abcd
echo %aa%
pause
运行这段命令就会显示"abcd"
需要说明的是,批处理中的变量是不区分类型的,不需要像C语言中的变量那样还要区分int、float、char等。比如执行set aa=345后,变量aa的值既可以被视为数字345,也可以被视为字符串345。
set命令具有扩展功能,如用作交互输入、字符串处理、数值计算等,属于高级命令范畴。
for语句(循环结构)
for语句可以实现类似于C语言里面的循环结构,当然for语句的功能要更强大一点,通过不同的开关可以实现更多的功能。for语句有多个开关,不同开关将会实现不同的功能。
无开关
无开关的for语句能够对设定的范围内进行循环,是最基本的for循环语句。其命令格式为:FOR %%variable IN (set) DO command
其中,%%variable是批处理程序里面的书写格式,在DOS中书写为%variable,即只有一个百分号(%);set就是需要我们设定的循环范围,类似于C语言里面的循环变量;do后面的command就是循环所执行的命令,即循环体。
无开关for语句举例:@echo off
for %%i in (a,"b c",d) do echo %%i
pause>nul
开关/L
含开关/L的for语句,可以根据set里面的设置进行循环,从而实现对循环次数的直接控制。其命令格式为:
FOR /L %%variable IN (start,step,end) DO command
其中,start为开始计数的初始值,step为每次递增的值,end为结束值。当end小于start时,step需要设置为负数。
含开关/L的for语句举例(创建5个文件夹):@echo off
for /l %%i in (1,2,10) do md %%i
pause
2. Svn命令
svnadmin dump
将文件系统的内容转储到标准输出。
概要
svnadmin dump REPOS_PATH [-r LOWER[:UPPER]] [--incremental]描述
使用“dumpfile”可移植格式将文件系统的内容转储到标准输出,将反馈发送到标准错误,导出的修订版本从LOWER到UPPER。如果没有提供修订版本,会导出所有的修订版本树,如果只提供LOWER,导出一个修订版本树。
如果Subversion的转储文件很大,你可以使用--deltas来减小svnadmin创建的导出文件的大小。通过这个选项,就不会写出每次修订版本的内容,svnadmin dump只会写出版本之间的区别。然而,创建增量导出文件的坏处―对CPU的要求更高,svndumpfilter不可以对这个文件操作,而且非增量的转储文件可以更好的压缩。选项
--revision (-r)
--incremental
--quiet
--deltas例子
- 转储整个版本库:
svnadmin dump /usr/local/svn/repos SVN-fs-dump-format-version: 1 Revision-number: 0 * Dumped revision 0. Prop-content-length: 56 Content-length: 56 …
- 从版本库增量转储一个单独的事务:
svnadmin dump /usr/local/svn/repos -r 21 --incremental * Dumped revision 21. SVN-fs-dump-format-version: 1 Revision-number: 21 Prop-content-length: 101 Content-length: 101 …
3. Bandizip命令
# Bandizip.exe <archive>
# Bandizip.exe <command> [<switches>...] <archive> [<files>...] [<path_to_extract>]
# Bandizip.exe <bcommand> [<switches>...] [<files>...]
<archive> 压缩包
执行在设置中指定的操作。 通常只打开压缩包。
<Commands> 命令
a : 添加文件到压缩包
x : 用完整路径解压文件
t : 测试压缩包完整性
d : 删除压缩包中文件
c : 创建新档案(或覆盖现有文件)
cd: 显示“新建压缩包”对话框
<BCommands> 批处理命令
bc:要压缩的每个文件/文件夹名称。 若存在相同的压缩包名,则以“文件名(2)”格式创建压缩包。若未指定目标文件夹,则默认目标文件夹为原始文件或文件夹所在的路径。
bx: 将每个压缩包分别解压到目标文件夹中。 若未指定目标文件夹,则默认目标文件夹为每个压缩文件所在的路径。
bt: 测试压缩包
<Switches> 开关
- 停止开关扫描
-l:<0...9> 设置压缩级别(0:存储,5:默认,9:最大)
-r- 禁用递归(默认)
-r 启用递归子目录
-aoa 无需提示覆盖全部现有文件
-aos 跳过已有文件的解压
-aou 自动重命名解压的文件
(例如,name.txt将被重命名为name (2).txt)
-sfx:[{name}] 创建SFX压缩包
-zopfli 使用Zopfli作为默认压缩算法
-p:{password} 设置密码
-o:{dir} 指定目标文件夹
-y 全选“是”
-fmt:{fmt} 指定压缩格式
(zip, zipx, exe, tar, tgz, lzh, iso, 7z, gz, xz)
-v:{size} 指定分卷大小 (-v:1000000 -v:1440k -v:100MB ...)
<Switches> (仅针对Banzip)
-email 压缩并邮件发送
-target:dlg 显示“目标路径选择”对话框
-target:auto 智能解压到目标路径
-target:name 按压缩包名称解压到目标路径中文件夹下
示例
1. 打开压缩包
Bandizip.exe sample.zip
2. 新建压缩包(覆盖已有文件)
Bandizip.exe c c:\sample.zip c:\src\
Bandizip.exe c c:\sample.zip c:\src1\ c:\src2\
3. 添加文件到压缩包
Bandizip.exe a c:\sample.zip c:\src\sample.txt
Bandizip.exe a c:\sample.zip c:\src\sample1.txt c:\src\sample2.txt
Bandizip.exe a c:\sample.zip c:\src*.txt c:\src*.jpg
4. 删除压缩包中文件
Bandizip.exe d c:\sample.zip sample.txt
Bandizip.exe d c:\sample.zip *.txt
5. 将压缩包解压到目标路径
Bandizip.exe x -o:c:\dest\ c:\sample.zip
6. 添加文件到压缩包,并设置密码为Passw0rd,无提示覆盖全部已有文件并关闭对话框
Bandizip.exe a -y -p:Passw0rd test.zip c:\src d:\src
4. 完整代码
1 @echo off 2 ::指定到Svn仓库目录 3 E: 4 set work_path=D:\SvnRepertory 5 set back_path=D:\SvnBack 6 set zip_path=D:\SvnBackPackage 7 cd %work_path% 8 9 ::使用for循环读取仓库目录下的所有仓库文件夹名称,并进行循环备份 10 for /d %%s in (*.*) do ( 11 echo %work_path%\%%s 12 svnadmin dump %work_path%\%%s > %back_path%\%%s.bak 13 ) 14 15 ::根据当前时间创建压缩包名称 16 set "year=%date:~0,4%" 17 set "month=%date:~5,2%" 18 set "day=%date:~8,2%" 19 set "hour_ten=%time:~0,1%" 20 set "hour_one=%time:~1,1%" 21 set "minute=%time:~3,2%" 22 set "second=%time:~6,2%" 23 if "%hour_ten%" == " " ( 24 set zipfile=%year%%month%%day%0%hour_one%%minute%%second%.zip 25 ) else ( 26 set zipfile=%year%%month%%day%%hour_ten%%hour_one%%minute%%second%.zip 27 ) 28 29 ::使用Bandizip命令进行压缩,在成功后弹窗提示操作完成,并打开备份目录 30 Bandizip.exe c %zip_path%\%zipfile% %back_path% 31 mshta vbscript:msgbox("备份并压缩成功,快去看看吧!",64,"提示")(window.close) 32 start %zip_path% 33 pause 34 exit
注意:如果弹出提示为乱码,则需要将文件另存为ANSI格式