返回列表 发帖

[文件管理] BAT+RAR实现备份的批处理代码

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

特别适合在Vista下工作,此系统下的备份工具太烦了。
XP下的备份工具没有压缩的功能,在这里也得到了解决。
@ECHO OFF
Title 备份@BAT by Bo QQ:104630166
::Ver 2008-11-16
COLOR 1F
::SETLOCAL ENABLEDELAYEDEXPANSION
::SETLOCAL DISABLEDELAYEDEXPANSION
Rem =========================参数整理===================
::帮助
IF "%*" EQU "/?" CALL :BRHelp && SHIFT /1
::传递进来的参数进行整理
IF /I "%*" EQU "SET" CALL :BRSet    %预留给计划或定时备份时使用,未完成%
:Parameter
      Rem ECHO -%1-
  SET "Parameter=%1"
      Rem ECHO -%Parameter%-
  IF  NOT DEFINED Parameter GOTO EndParameter
  %BMRem% IF /I "%Parameter:~0,3%" EQU "BM-" ( SET "BackupMode=%Parameter:~3%" && SET "BMRem=Rem" ) && GOTO IFParameter
  %BLRem% IF /I "%Parameter:~0,3%" EQU "BL-" ( SET "BackupList=%Parameter:~3%" && SET "BLRem=Rem" ) && GOTO IFParameter
  %BORem% IF /I "%Parameter:~0,3%" EQU "BO-" ( SET "BackupOutput=%Parameter:~3%" && SET "BORem=Rem" ) && GOTO IFParameter
  %RarVRem% IF /I "%Parameter:~0,5%" EQU "RarV-" ( SET "RarV=%Parameter:~5%" && SET "RarVRem=Rem" ) && GOTO IFParameter
  %RarKRem% IF /I "%Parameter:~0,5%" EQU "RarK-" ( SET "RarK=%Parameter:~5%" && SET "RarKRem=Rem" ) && GOTO IFParameter
  %RarRIRem% IF /I "%Parameter:~0,6%" EQU "RarRI-" ( SET "RarRI=%Parameter:~6%" && SET "RarRIRem=Rem" ) && GOTO IFParameter
  %RarRVRem% IF /I "%Parameter:~0,6%" EQU "RarRV-" ( SET "RarRV=%Parameter:~6%" && SET "RarRVRem=Rem" ) && GOTO IFParameter
  %PRRem% IF /I "%Parameter:~0,3%" EQU "PR-"  ( SET "PathRar=%Parameter:~3%" && SET "PRRem=Rem" ) && GOTO IFParameter
  ECHO. && ECHO. && ECHO %Parameter% && CALL :ERROR && EXIT /B
:IFParameter
SHIFT /1
  SET "Parameter="
GOTO Parameter
:EndParameter
::测试时显显示各参数的值
IF 1 LSS 0 (
  ECHO 1.备份方式“%BackupMode%
  ECHO 2.备份清单路径“%BackupList%
  ECHO 3.输出“%BackupOutput%
  ECHO 4.分卷“%RarV%
  ECHO 5.锁定“%RarK%
  ECHO 6.优先级“%RarRI%
  ECHO 7.恢复卷“%RarRV%
  ECHO 8.RAR.exe路径“PathRar”
PAUSE
)
Rem =========================准备工作===================
::获取桌面的路径
IF NOT DEFINED Desktop (
  ECHO WSCRIPT.ECHO CREATEOBJECT^("WSCRIPT.SHELL"^).REGREAD^("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Desktop"^)>"%TEMP%\Tmp.vbs"
  FOR /F "DELIMS=" %%I IN ('CSCRIPT //NOLOGO "%TEMP%\Tmp.vbs"') DO ( CALL SET "Desktop=%%~I" )
  ERASE /F /Q /S "%TEMP%\Tmp~.vbs" 2>NUL 1>NUL
)
SET "DateTime=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%%Time:~0,2%%Time:~3,2%%Time:~6,2%"
Rem =========================WinRar,变量PR===================
ECHO.
IF DEFINED PathRar GOTO ChPathRar
:PathRar
::获取RAR.exe的路径
::REG QUERY "HKCR\WinRAR\DefaultIcon" /VE /F DATA /D 2>NUL 1>NUL || GOTO ChPathRar
::REG QUERY "HKCR\WinRAR\DefaultIcon" /VE 2>NUL 1>NUL || GOTO ChPathRar
ECHO WSCRIPT.ECHO CREATEOBJECT("WSCRIPT.SHELL").REGREAD("HKCR\WinRAR\DefaultIcon\")>"%TEMP%\Tmp.vbs"
FOR /F "DELIMS=" %%I IN ('CSCRIPT //NOLOGO "%TEMP%\Tmp.vbs"') DO ( CALL SET "PathRar=%%~dpI" )
ERASE /F /Q /S "%TEMP%\Tmp~.vbs" 2>NUL 1>NUL
    Rem ECHO [%PathRar%] && PAUSE
:ChPathRar
IF %PathRar:~-1% EQU ^\ (
  SET "PathRar=%PathRar:~0,-1%"
)
SETLOCAL ENABLEDELAYEDEXPANSION
IF NOT EXIST "%PathRar%\RAR.EXE" (
  IF EXIST "%ProgramFiles%\WinRAR\RAR.exe" ( CALL SET "PathRar=%ProgramFiles%\WinRAR\RAR.EXE"  ) && GOTO EndPathRar
  IF /I "%TempPathRar%" EQU "Error" (
    ECHO. && ECHO. && ECHO ErrorLelel-PR && CALL :ERROR
  )
  ECHO.
  ECHO  系统未安装 WinRAR 软件,
  ECHO   或找不到 RAR.exe 文件,
  ECHO   请先安装 WinRAR 软件或
  ECHO   输入 RAR.exe 所在路径,
  ECHO  [回车] 退出
  ECHO.
  SET "PathRar="
  SET /P PathRar=
      Rem SET "PathRar=!PathRar:^%=^!!"
  IF "!PathRar!" EQU "" ( EXIT /B )
      Rem ECHO TEST && ECHO !PATHRAR! && pause
  SET "TempPathRar=Error"
) && GOTO ChPathRar
SETLOCAL DISABLEDELAYEDEXPANSION
SET "PathRar=%PathRar%\RAR.EXE"
:EndPathRar
FOR /F "Skip=1 TOKENS=2" %%I IN ('"%PathRar%"/?') DO (
  SET "RarVer=%%I"
  GOTO CVRar
)
:CVRar
IF "%RarVer%" LSS "3" (
  ECHO.
  ECHO RAR 版本不支持,程序即将退出!
  ECHO.
  PAUSE
  EXIT /B
)
Rem =========================备份方式,变量BM===================
ECHO.
IF DEFINED BM GOTO CHBackupMode
::备份方式的选择
:BackupMode
ECHO.
ECHO 请选择备份方式:
ECHO  完整备份
ECHO [D] 差异备份
ECHO  增量备份
ECHO [H] 帮助
ECHO.
SET "BackupMode="
SET /P BackupMode=请选择: 
:ChBackupMode
IF /I "%BackupMode%" EQU "B" ( SET "DirA=A" ) && ( SET "RarAc=-AC" ) && GOTO EndBackupMode
IF /I "%BackupMode%" EQU "D" ( SET "DirA=A:A" ) && ( SET "RarAc=" ) && GOTO EndBackupMode
IF /I "%BackupMode%" EQU "I" ( SET "DirA=A:A" ) && ( SET "RarAc=-AC" ) && GOTO EndBackupMode
IF /I "%BackupMode%" EQU "H" (
  ECHO.
  ECHO.
  ECHO.
  ECHO 完整备份:备份用户指定的全部文档,并标记
  ECHO      为“已备份”;
  ECHO 差异备份:备份用户指定文档中的“已更改”
  ECHO      或新建文档,不改变备件标记;
  ECHO 增量备份:备份用户指定文档中的“已更改”
  ECHO      或新建文档,并标记为“已备份”
) && GOTO BackupMode
ECHO. && ECHO. && ECHO ErrorLelel-BM && CALL :ERROR && GOTO BackupMode
:EndBackupMode
Rem =========================备份清单,变量BL===================
ECHO.
::Vista下不支持CMD窗口获取拖进来的文件路径
::备份清单
:BackupList
IF DEFINED BL GOTO ChBackupList
  IF NOT EXIST "%Desktop%\BackupList.txt" (
        ECHO ;备件清单:>"%Desktop%\BackupList.txt"
        ECHO ;请在下面填入将要备份的文件(夹)的路径>>"%Desktop%\BackupList.txt"
        ECHO ;多行输入。>>"%Desktop%\BackupList.txt"
        ECHO ;保存并退出,程序即可继续执行。>>"%Desktop%\BackupList.txt"
        ECHO ;↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓>>"%Desktop%\BackupList.txt"
    ECHO.>>"%Desktop%\BackupList.txt"
    ECHO.
    ECHO 请在桌面的 BackupList.txt 文件中
    ECHO 填入将要备份的文件(夹)的路径,
    ECHO 多行输入。
        NOTEPAD "%Desktop%\BackupList.txt"
  ) ELSE (
      ECHO.
      ECHO 请确认桌面的 BackupList.txt 文件中是备份文件的路径。
      ECHO 如果不是,请删除此文件。
        )
        SET "BackupList=%Desktop%\BackupList.txt"
:ChBackupList
  ECHO //备份日期:%DATE%>>"%Temp%\RarFiles%DateTime%.lst
  ECHO //备份时间:%TIME%>>"%Temp%\RarFiles%DateTime%.lst
  ECHO.>>"%Temp%\RarFiles%DateTime%.lst
FOR /F "EOL=;" %%I IN ( %BackupList% ) DO (
      Rem ECHO %%I && PAUSE
  DIR "%%~I" /%DirA% /B /S 2>NUL >>"%Temp%\RarFiles%DateTime%.lst"
)
:EndBackupList
Rem =========================输出路径,变量BO===================
ECHO.
::未涉及网络路径
::输出的路径
IF DEFINED BO GOTO ChBackupOutput
:BackupOutput
ECHO.
ECHO 备份文件将以此时的的日期和时间命名
    Rem ECHO %DateTime%
ECHO.
ECHO 请输入备份文件“Backup%DateTime%.RAR”的保存路径:
ECHO.
SET "BackupOutput="
SET /P BackupOutput=
:ChBackupOutput
IF "%BackupOutput:~-1%" EQU "^\" SET "BackupOutput=%BackupOutput:~0,-1%"
::PUSHD %~DP0
CD /D "%BackupOutput%" 2>NUL || MD %BackupOutput% 2>NUL || ( ECHO. && ECHO. && ECHO ErrorLelel-BO && CALL :ERROR && GOTO BackupOutput )
::POPD
SET "BackupOutput=%BackupOutput%\Backup%DateTime%.RAR"
:EndBackupOutput
Rem =========================压缩===================
ECHO.
IF NOT DEFINED RarV SET "RarV=102400^*1024"    %设置分卷压缩时分卷的大小,102400×1024等于100M%
IF NOT DEFINED RarK SET "RarK=-K"    %设置压缩文件是否被锁定%
IF NOT DEFINED RarRI SET "RarRI=RI1:1"    %设置压缩时的优先级和休眠时间%
IF NOT DEFINED RarRV SET "RarRV=5"    %设置恢复卷比例%
"%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"
::   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"
IF ERRORLEVEL 2 ( SET "MSGBOXVBS=未知错误") && GOTO MSGBOXVBS
IF ERRORLEVEL 1 ( SET "MSGBOXVBS=没有需要备份的文件" ) && GOTO MSGBOXVBS
SET "MSGBOXVBS=备份数据已经完成"
:MSGBOXVBS
@ECHO MSGBOX "   %MSGBOXVBS%   ", ,"by Bo QQ:104630166" >%Temp%\MSG.VBS
@"%Temp%\MSG.VBS"
ERASE /F /S /Q /A "%Temp%\RarFiles%DateTime%.lst" 1>NUL
ERASE /F /Q /S %Temp%\MSG.VBS 2>NUL 1>NUL
EXIT /B
Rem =========================报错===================
:ERROR
ECHO. && ECHO.
COLOR 0C
ECHO 错误,请重新输入:
ECHO.
PAUSE
ECHO.
COLOR 1F
EXIT /B
Rem =========================帮助===================
:BRHelp
ECHO.
ECHO BM-[B^|D^|I]  备份方式(完整、差异、增量),例:BM-B
ECHO.
ECHO BL-[drive:[path[filename]]]
ECHO         写有备份清单文件的完全路径及文件名,例:BL-"D:\backuprar.txt"
ECHO.
ECHO BO-[drive:[path]]
ECHO         输出完整路径,不含文件名,例:BO-"D:\backup"
ECHO.
ECHO RarV-V^<大小^> 设置分卷压缩时分卷的大小,单位:M,例:RarV-V1048576
ECHO.
ECHO RarK-[K^|U]   设置压缩文件是否被锁定,例:RarK-U
ECHO.
ECHO RarRI-RI^<P^>[:^<S^>]
ECHO         设置压缩时的优先级和休眠时间,例:RarRI-RI5:5
ECHO         优先级0默认,1-最小,15-最大
ECHO         休眠时间以毫秒为单位
ECHO.
ECHO RarRV-RV[N]P  设置恢复卷比例,百分比,例:RarRV-RV10P
ECHO.
ECHO PR-[drive:[path]] 文件 rxr.exe 路径
ECHO.
PAUSE
EXIT /B
Rem =========================计划任务===================
:BRSetCOPY
迫不及待的把代码发了上来,有不足之处还请批语指正!

[ 本帖最后由 ibm 于 2008-11-23 14:11 编辑 ]
2

评分人数

我已经查过了RAR的帮助,我的问题不在于RAR,但已经解决了,现在正在完善我的代码,做好后会与大家分享,还请大家多提宝贵意见。

TOP

怎么没人给我评价啊,还是不被大家重视!

TOP

谢谢您的鼓励,我是想大家能给我提点建议,以优化和完善的的作品。

TOP

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的路径的有效性验证,已经写在代码中。

TOP

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

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

TOP

谢谢表扬!

TOP

返回列表