Board logo

标题: [文件管理] BAT+RAR实现备份的批处理代码 [打印本页]

作者: ibm    时间: 2008-11-10 21:28     标题: BAT+RAR实现备份的批处理代码

批处理调用RAR,实现数据的备份,
备份方式可选,
测试平台:Vista Ultimate,WinRAR V3.8
工作环境:Win2000、XP、Vista等,
    必须有 WinRAR 的命令行程序 RAR.exe,且不低于3.0版。

特别适合在Vista下工作,此系统下的备份工具太烦了。
XP下的备份工具没有压缩的功能,在这里也得到了解决。
  1. @ECHO OFF
  2. Title 备份@BAT by Bo QQ:104630166
  3. ::Ver 2008-11-16
  4. COLOR 1F
  5. ::SETLOCAL ENABLEDELAYEDEXPANSION
  6. ::SETLOCAL DISABLEDELAYEDEXPANSION
  7. Rem =========================参数整理===================
  8. ::帮助
  9. IF "%*" EQU "/?" CALL :BRHelp && SHIFT /1
  10. ::传递进来的参数进行整理
  11. IF /I "%*" EQU "SET" CALL :BRSet    %预留给计划或定时备份时使用,未完成%
  12. :Parameter
  13.       Rem ECHO -%1-
  14.   SET "Parameter=%1"
  15.       Rem ECHO -%Parameter%-
  16.   IF  NOT DEFINED Parameter GOTO EndParameter
  17.   %BMRem% IF /I "%Parameter:~0,3%" EQU "BM-" ( SET "BackupMode=%Parameter:~3%" && SET "BMRem=Rem" ) && GOTO IFParameter
  18.   %BLRem% IF /I "%Parameter:~0,3%" EQU "BL-" ( SET "BackupList=%Parameter:~3%" && SET "BLRem=Rem" ) && GOTO IFParameter
  19.   %BORem% IF /I "%Parameter:~0,3%" EQU "BO-" ( SET "BackupOutput=%Parameter:~3%" && SET "BORem=Rem" ) && GOTO IFParameter
  20.   %RarVRem% IF /I "%Parameter:~0,5%" EQU "RarV-" ( SET "RarV=%Parameter:~5%" && SET "RarVRem=Rem" ) && GOTO IFParameter
  21.   %RarKRem% IF /I "%Parameter:~0,5%" EQU "RarK-" ( SET "RarK=%Parameter:~5%" && SET "RarKRem=Rem" ) && GOTO IFParameter
  22.   %RarRIRem% IF /I "%Parameter:~0,6%" EQU "RarRI-" ( SET "RarRI=%Parameter:~6%" && SET "RarRIRem=Rem" ) && GOTO IFParameter
  23.   %RarRVRem% IF /I "%Parameter:~0,6%" EQU "RarRV-" ( SET "RarRV=%Parameter:~6%" && SET "RarRVRem=Rem" ) && GOTO IFParameter
  24.   %PRRem% IF /I "%Parameter:~0,3%" EQU "PR-"  ( SET "PathRar=%Parameter:~3%" && SET "PRRem=Rem" ) && GOTO IFParameter
  25.   ECHO. && ECHO. && ECHO %Parameter% && CALL :ERROR && EXIT /B
  26. :IFParameter
  27. SHIFT /1
  28.   SET "Parameter="
  29. GOTO Parameter
  30. :EndParameter
  31. ::测试时显显示各参数的值
  32. IF 1 LSS 0 (
  33.   ECHO 1.备份方式“%BackupMode%”
  34.   ECHO 2.备份清单路径“%BackupList%”
  35.   ECHO 3.输出“%BackupOutput%”
  36.   ECHO 4.分卷“%RarV%”
  37.   ECHO 5.锁定“%RarK%”
  38.   ECHO 6.优先级“%RarRI%”
  39.   ECHO 7.恢复卷“%RarRV%”
  40.   ECHO 8.RAR.exe路径“PathRar”
  41. PAUSE
  42. )
  43. Rem =========================准备工作===================
  44. ::获取桌面的路径
  45. IF NOT DEFINED Desktop (
  46.   ECHO WSCRIPT.ECHO CREATEOBJECT^("WSCRIPT.SHELL"^).REGREAD^("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Desktop"^)>"%TEMP%\Tmp.vbs"
  47.   FOR /F "DELIMS=" %%I IN ('CSCRIPT //NOLOGO "%TEMP%\Tmp.vbs"') DO ( CALL SET "Desktop=%%~I" )
  48.   ERASE /F /Q /S "%TEMP%\Tmp~.vbs" 2>NUL 1>NUL
  49. )
  50. SET "DateTime=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%%Time:~0,2%%Time:~3,2%%Time:~6,2%"
  51. Rem =========================WinRar,变量PR===================
  52. ECHO.
  53. IF DEFINED PathRar GOTO ChPathRar
  54. :PathRar
  55. ::获取RAR.exe的路径
  56. ::REG QUERY "HKCR\WinRAR\DefaultIcon" /VE /F DATA /D 2>NUL 1>NUL || GOTO ChPathRar
  57. ::REG QUERY "HKCR\WinRAR\DefaultIcon" /VE 2>NUL 1>NUL || GOTO ChPathRar
  58. ECHO WSCRIPT.ECHO CREATEOBJECT("WSCRIPT.SHELL").REGREAD("HKCR\WinRAR\DefaultIcon\")>"%TEMP%\Tmp.vbs"
  59. FOR /F "DELIMS=" %%I IN ('CSCRIPT //NOLOGO "%TEMP%\Tmp.vbs"') DO ( CALL SET "PathRar=%%~dpI" )
  60. ERASE /F /Q /S "%TEMP%\Tmp~.vbs" 2>NUL 1>NUL
  61.     Rem ECHO [%PathRar%] && PAUSE
  62. :ChPathRar
  63. IF %PathRar:~-1% EQU ^\ (
  64.   SET "PathRar=%PathRar:~0,-1%"
  65. )
  66. SETLOCAL ENABLEDELAYEDEXPANSION
  67. IF NOT EXIST "%PathRar%\RAR.EXE" (
  68.   IF EXIST "%ProgramFiles%\WinRAR\RAR.exe" ( CALL SET "PathRar=%ProgramFiles%\WinRAR\RAR.EXE"  ) && GOTO EndPathRar
  69.   IF /I "%TempPathRar%" EQU "Error" (
  70.     ECHO. && ECHO. && ECHO ErrorLelel-PR && CALL :ERROR
  71.   )
  72.   ECHO.
  73.   ECHO  系统未安装 WinRAR 软件,
  74.   ECHO   或找不到 RAR.exe 文件,
  75.   ECHO   请先安装 WinRAR 软件或
  76.   ECHO   输入 RAR.exe 所在路径,
  77.   ECHO  [回车] 退出
  78.   ECHO.
  79.   SET "PathRar="
  80.   SET /P PathRar=
  81.       Rem SET "PathRar=!PathRar:^%=^!!"
  82.   IF "!PathRar!" EQU "" ( EXIT /B )
  83.       Rem ECHO TEST && ECHO !PATHRAR! && pause
  84.   SET "TempPathRar=Error"
  85. ) && GOTO ChPathRar
  86. SETLOCAL DISABLEDELAYEDEXPANSION
  87. SET "PathRar=%PathRar%\RAR.EXE"
  88. :EndPathRar
  89. FOR /F "Skip=1 TOKENS=2" %%I IN ('"%PathRar%"/?') DO (
  90.   SET "RarVer=%%I"
  91.   GOTO CVRar
  92. )
  93. :CVRar
  94. IF "%RarVer%" LSS "3" (
  95.   ECHO.
  96.   ECHO RAR 版本不支持,程序即将退出!
  97.   ECHO.
  98.   PAUSE
  99.   EXIT /B
  100. )
  101. Rem =========================备份方式,变量BM===================
  102. ECHO.
  103. IF DEFINED BM GOTO CHBackupMode
  104. ::备份方式的选择
  105. :BackupMode
  106. ECHO.
  107. ECHO 请选择备份方式:
  108. ECHO  完整备份
  109. ECHO [D] 差异备份
  110. ECHO  增量备份
  111. ECHO [H] 帮助
  112. ECHO.
  113. SET "BackupMode="
  114. SET /P BackupMode=请选择: 
  115. :ChBackupMode
  116. IF /I "%BackupMode%" EQU "B" ( SET "DirA=A" ) && ( SET "RarAc=-AC" ) && GOTO EndBackupMode
  117. IF /I "%BackupMode%" EQU "D" ( SET "DirA=A:A" ) && ( SET "RarAc=" ) && GOTO EndBackupMode
  118. IF /I "%BackupMode%" EQU "I" ( SET "DirA=A:A" ) && ( SET "RarAc=-AC" ) && GOTO EndBackupMode
  119. IF /I "%BackupMode%" EQU "H" (
  120.   ECHO.
  121.   ECHO.
  122.   ECHO.
  123.   ECHO 完整备份:备份用户指定的全部文档,并标记
  124.   ECHO      为“已备份”;
  125.   ECHO 差异备份:备份用户指定文档中的“已更改”
  126.   ECHO      或新建文档,不改变备件标记;
  127.   ECHO 增量备份:备份用户指定文档中的“已更改”
  128.   ECHO      或新建文档,并标记为“已备份”
  129. ) && GOTO BackupMode
  130. ECHO. && ECHO. && ECHO ErrorLelel-BM && CALL :ERROR && GOTO BackupMode
  131. :EndBackupMode
  132. Rem =========================备份清单,变量BL===================
  133. ECHO.
  134. ::Vista下不支持CMD窗口获取拖进来的文件路径
  135. ::备份清单
  136. :BackupList
  137. IF DEFINED BL GOTO ChBackupList
  138.   IF NOT EXIST "%Desktop%\BackupList.txt" (
  139.         ECHO ;备件清单:>"%Desktop%\BackupList.txt"
  140.         ECHO ;请在下面填入将要备份的文件(夹)的路径>>"%Desktop%\BackupList.txt"
  141.         ECHO ;多行输入。>>"%Desktop%\BackupList.txt"
  142.         ECHO ;保存并退出,程序即可继续执行。>>"%Desktop%\BackupList.txt"
  143.         ECHO ;↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓>>"%Desktop%\BackupList.txt"
  144.     ECHO.>>"%Desktop%\BackupList.txt"
  145.     ECHO.
  146.     ECHO 请在桌面的 BackupList.txt 文件中
  147.     ECHO 填入将要备份的文件(夹)的路径,
  148.     ECHO 多行输入。
  149.         NOTEPAD "%Desktop%\BackupList.txt"
  150.   ) ELSE (
  151.       ECHO.
  152.       ECHO 请确认桌面的 BackupList.txt 文件中是备份文件的路径。
  153.       ECHO 如果不是,请删除此文件。
  154.         )
  155.         SET "BackupList=%Desktop%\BackupList.txt"
  156. :ChBackupList
  157.   ECHO //备份日期:%DATE%>>"%Temp%\RarFiles%DateTime%.lst
  158.   ECHO //备份时间:%TIME%>>"%Temp%\RarFiles%DateTime%.lst
  159.   ECHO.>>"%Temp%\RarFiles%DateTime%.lst
  160. FOR /F "EOL=;" %%I IN ( %BackupList% ) DO (
  161.       Rem ECHO %%I && PAUSE
  162.   DIR "%%~I" /%DirA% /B /S 2>NUL >>"%Temp%\RarFiles%DateTime%.lst"
  163. )
  164. :EndBackupList
  165. Rem =========================输出路径,变量BO===================
  166. ECHO.
  167. ::未涉及网络路径
  168. ::输出的路径
  169. IF DEFINED BO GOTO ChBackupOutput
  170. :BackupOutput
  171. ECHO.
  172. ECHO 备份文件将以此时的的日期和时间命名
  173.     Rem ECHO %DateTime%
  174. ECHO.
  175. ECHO 请输入备份文件“Backup%DateTime%.RAR”的保存路径:
  176. ECHO.
  177. SET "BackupOutput="
  178. SET /P BackupOutput=
  179. :ChBackupOutput
  180. IF "%BackupOutput:~-1%" EQU "^\" SET "BackupOutput=%BackupOutput:~0,-1%"
  181. ::PUSHD %~DP0
  182. CD /D "%BackupOutput%" 2>NUL || MD %BackupOutput% 2>NUL || ( ECHO. && ECHO. && ECHO ErrorLelel-BO && CALL :ERROR && GOTO BackupOutput )
  183. ::POPD
  184. SET "BackupOutput=%BackupOutput%\Backup%DateTime%.RAR"
  185. :EndBackupOutput
  186. Rem =========================压缩===================
  187. ECHO.
  188. IF NOT DEFINED RarV SET "RarV=102400^*1024"    %设置分卷压缩时分卷的大小,102400×1024等于100M%
  189. IF NOT DEFINED RarK SET "RarK=-K"    %设置压缩文件是否被锁定%
  190. IF NOT DEFINED RarRI SET "RarRI=RI1:1"    %设置压缩时的优先级和休眠时间%
  191. IF NOT DEFINED RarRV SET "RarRV=5"    %设置恢复卷比例%
  192. "%PathRar%" A %RarAc% -AV- -EP3 -ISND %RarK% -M5 -%RarRI% -RR5P -RV%RarRV%P -T -V%RarV%  -W%Temp% -z"%Temp%\RarFiles%DateTime%.lst" "%BackupOutput%" @"%Temp%\RarFiles%DateTime%.lst"
  193. ::   RAR    A   -AC    -AV- -EP3 -ISND   -K    -M5  -RI5:5  -RR5P  -RV10P -T -V1048576 -W%Temp% -z"%Temp%\RarFiles%DateTime%.lst" "%Desktop%\Backup%DateTime%.rar" @"%Temp%\RarFiles%DateTime%.lst"
  194. IF ERRORLEVEL 2 ( SET "MSGBOXVBS=未知错误") && GOTO MSGBOXVBS
  195. IF ERRORLEVEL 1 ( SET "MSGBOXVBS=没有需要备份的文件" ) && GOTO MSGBOXVBS
  196. SET "MSGBOXVBS=备份数据已经完成"
  197. :MSGBOXVBS
  198. @ECHO MSGBOX "   %MSGBOXVBS%   ", ,"by Bo QQ:104630166" >%Temp%\MSG.VBS
  199. @"%Temp%\MSG.VBS"
  200. ERASE /F /S /Q /A "%Temp%\RarFiles%DateTime%.lst" 1>NUL
  201. ERASE /F /Q /S %Temp%\MSG.VBS 2>NUL 1>NUL
  202. EXIT /B
  203. Rem =========================报错===================
  204. :ERROR
  205. ECHO. && ECHO.
  206. COLOR 0C
  207. ECHO 错误,请重新输入:
  208. ECHO.
  209. PAUSE
  210. ECHO.
  211. COLOR 1F
  212. EXIT /B
  213. Rem =========================帮助===================
  214. :BRHelp
  215. ECHO.
  216. ECHO BM-[B^|D^|I]  备份方式(完整、差异、增量),例:BM-B
  217. ECHO.
  218. ECHO BL-[drive:[path[filename]]]
  219. ECHO         写有备份清单文件的完全路径及文件名,例:BL-"D:\backuprar.txt"
  220. ECHO.
  221. ECHO BO-[drive:[path]]
  222. ECHO         输出完整路径,不含文件名,例:BO-"D:\backup"
  223. ECHO.
  224. ECHO RarV-V^<大小^> 设置分卷压缩时分卷的大小,单位:M,例:RarV-V1048576
  225. ECHO.
  226. ECHO RarK-[K^|U]   设置压缩文件是否被锁定,例:RarK-U
  227. ECHO.
  228. ECHO RarRI-RI^<P^>[:^<S^>]
  229. ECHO         设置压缩时的优先级和休眠时间,例:RarRI-RI5:5
  230. ECHO         优先级0默认,1-最小,15-最大
  231. ECHO         休眠时间以毫秒为单位
  232. ECHO.
  233. ECHO RarRV-RV[N]P  设置恢复卷比例,百分比,例:RarRV-RV10P
  234. ECHO.
  235. ECHO PR-[drive:[path]] 文件 rxr.exe 路径
  236. ECHO.
  237. PAUSE
  238. EXIT /B
  239. Rem =========================计划任务===================
  240. :BRSet
复制代码
迫不及待的把代码发了上来,有不足之处还请批语指正!

[ 本帖最后由 ibm 于 2008-11-23 14:11 编辑 ]
作者: Batcher    时间: 2008-11-11 12:08

建议楼主阅读rar.exe的帮助文档,然后自己尝试写批处理,遇到具体问题再问,而不是直接要代码。
作者: ibm    时间: 2008-11-11 16:10

我已经查过了RAR的帮助,我的问题不在于RAR,但已经解决了,现在正在完善我的代码,做好后会与大家分享,还请大家多提宝贵意见。
作者: Batcher    时间: 2008-11-11 19:32     标题: 回复 3楼 的帖子

期待你的分享^_^
作者: BBCC    时间: 2008-11-13 19:26

不错,ibm兄真是厉害!
作者: ibm    时间: 2008-11-13 20:33

怎么没人给我评价啊,还是不被大家重视!
作者: Batcher    时间: 2008-11-13 22:14     标题: 回复 6楼 的帖子

是金子总会发光的
保持平和的心态
多学习多交流
受人敬仰是迟早的事情
加油
作者: ibm    时间: 2008-11-14 10:37

谢谢您的鼓励,我是想大家能给我提点建议,以优化和完善的的作品。
作者: Batcher    时间: 2008-11-14 11:16     标题: 回复 8楼 的帖子

大致看了一下前半部分,有几个疑问想请教一下:

::FOR /F "DELIMS=" %%I IN ('CSCRIPT //NOLOGO "%TEMP%\t~.vbs"') DO ( CALL SET "Desktop=%%~I" )
你在使用 set 命令的时候,多次使用 call set xxx,为何要用 call 呢?

::SET "DateTime=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%%Time:~0,2%%Time:~3,2%%Time:~6,2%"
不同的操作系统,日期时间的格式可能存在很大差异,这一点是否需要考虑呢?

::REG QUERY "HKCR\WinRAR\DefaultIcon" /VE 2>NUL >%TEMP%\PathRar.TMP
是否需要考虑 reg query 可能"吃中文字符"的问题呢?

另外:
自动获取的WinRAR路径的时候,是否考虑添加全盘搜索的方法呢?
是否需要对用户输入的WinRAR路径进行有效性验证呢?

后面的代码还没看,有问题以后再请教。
作者: ibm    时间: 2008-11-14 11:49

1. .::FOR /F "DELIMS=" %%I IN ('CSCRIPT //NOLOGO "%TEMP%\t~.vbs"') DO ( CALL SET "Desktop=%%~I" )
你在使用 set 命令的时候,多次使用 call set xxx,为何要用 call 呢?
答:获取注册表中Desktop的路径并赋值给Desktop,若不用Call,
Echo [%Desktop%]
结果是:[%USERPROFILE%\桌面],含有变量,

2. ::SET "DateTime=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%%Time:~0,2%%Time:~3,2%%Time:~6,2%"
不同的操作系统,日期时间的格式可能存在很大差异,这一点是否需要考虑呢?
答:我发现不同系统是不太一样,但暂时只发现Vista下的日期格式后面多了星期,而我的这种方法不受影响,如果还有哪些系统的日期时间格式不同,还请赐教。

3. ::REG QUERY "HKCR\WinRAR\DefaultIcon" /VE 2>NUL >%TEMP%\PathRar.TMP
是否需要考虑 reg query 可能"吃中文字符"的问题呢?
答:考虑了Desktop的路径会含有中文,RAR的路径却忽略了,我会加以改进的。

4. 自动获取的WinRAR路径的时候,是否考虑添加全盘搜索的方法呢?
是否需要对用户输入的WinRAR路径进行有效性验证呢?
答:是考虑过全盘搜索,没有应该第一是因为不会写代码,第二是现在硬盘都很大,搜索起来会很慢。
对于用户输入的WinRAR的路径的有效性验证,已经写在代码中。
作者: Batcher    时间: 2008-11-14 14:30     标题: 回复 10楼 的帖子

::我发现不同系统是不太一样,但暂时只发现Vista下的日期格式后面多了星期,而我的这种方法不受影响,如果还有哪些系统的日期时间格式不同,还请赐教。
参考:批处理标准化获取当前系统日期
http://www.cn-dos.net/forum/viewthread.php?tid=41857

::是考虑过全盘搜索,没有应该第一是因为不会写代码,第二是现在硬盘都很大,搜索起来会很慢。
你可以找找全盘搜索的代码,我以前写QQ自动登陆的代码,用 for /r 全盘搜索,速度还是挺快的。

::对于用户输入的WinRAR的路径的有效性验证,已经写在代码中。
看到了,原来放在后面的 for 里面一起验证的。
作者: ibm    时间: 2008-11-14 17:02

您给的地址:http://www.cn-dos.net/forum/viewthread.php?tid=41857
我打不开:“对不起,本帖要求 积分 高于 1 点 才可浏览,请返回。”

对于rar.exe文件的全盘搜索,我想了想,还是不太好,
因为如果有多个同名文件,又不知道是什么东东,不好处理,
而我还要执行它以判断其版是否支持,会有风险,所以还是不搜索了。
作者: BBCC    时间: 2008-11-14 19:38

来自http://www.cn-dos.net/forum/viewthread.php?tid=41857
  1. @echo off
  2. rem 需要reg.exe的支持
  3. for /f "skip=4 delims= " %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate') do set DateFormat=%%a
  4. set DateFormat=%DateFormat:~-8%
  5. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy-M-d /f>nul
  6. set Today=%date: =%
  7. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %DateFormat% /f>nul
  8. if "%Today:~0,1%" gtr "9" (
  9.   set Today=%Today:~-10%
  10. ) else (
  11.   set Today=%Today:~0,10%
  12. )
  13. echo %Today%
复制代码
  1. @echo off
  2. rem 需要保证注册表编辑器没有处于锁定状态
  3. regedit /e "%temp%\bak.reg" "HKEY_CURRENT_USER\Control Panel\International"
  4. >aDate.reg echo REGEDIT4
  5. >>aDate.reg echo.
  6. >>aDate.reg echo [HKEY_CURRENT_USER\Control Panel\International]
  7. >>aDate.reg echo "sShortDate"="yyyy-MM-dd"
  8. regedit /s aDate.reg&&del aDate.reg
  9. set Today=%date: =%
  10. regedit /s "%temp%\bak.reg"&&del "%temp%\bak.reg"
  11. if "%Today:~0,1%" gtr "9" (
  12.   set Today=%Today:~-10%
  13. ) else (
  14.   set Today=%Today:~0,10%
  15. )
  16. echo %Today%
复制代码
贴两个出来,原来还有个这样的帖子。

[ 本帖最后由 BBCC 于 2008-11-14 19:39 编辑 ]
作者: pusofalse    时间: 2008-11-14 19:43

IBM进步好快啊,加油!
作者: ibm    时间: 2008-11-14 20:13

谢谢表扬!
作者: zhangop9    时间: 2011-8-21 02:27

给个Bat下载版的,我的不能用
作者: zhangop9    时间: 2011-8-21 20:42

你这个要短路径,我的是完整路径要如何改一下你的bat 了




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2