Bat应用 - 备份项目

来源:互联网 发布:unity3d特效 编辑:程序博客网 时间:2024/04/27 17:45

运用批处理解决工作项目相关源码、文档、数据库等重要文件的备份问题

A. 准备工作
1. 目录制定
    首先要制定一个项目的基本目录格式,这样才方便代码、文档、数据库的分类存放
    我这里是这样建立目录的 (以工作的项目BSA为例)
  BSA  -- 项目根目录
    ├─Code  -- 源码根目录
    │  └─BSA_Online    -- 源码子目录  
    ├─DataBase -- 数据库根目录
    │  ├─DataBaseFile    --数据库文件、备份文件目录
    │  ├─PD                --数据库设计 PowerDesigner文件目录
    │  └─SqlScript        -- 相关SQL Script
    ├─Documents        -- 相关文档根目录
    ├─Other        --其他目录
    └─Temp        --临时目录 
2. 功能分析
    通常我会每天备份Code & Database,定期的备份Documents & Other,不定期的备份所有文档
    这样就要求批处理能兼容三种功能
    另外,需要配合360云盘同步盘达到在线备份的目的,需要将备份的文档进行打包,自动上传云盘。

B. 代码分析 & 编写
1. 文件夹复制
    将源文件夹的文档复制到目标文件夹
    可利用XCOPY / COPY 二个命令完成
    a. COPY 便于复制单个文件
        COPY /Y [SourceFile] [TargetFile]        
        /Y 用于默认覆盖复制
    b. XCOPY 便于复制文件夹
        XCOPY "%SourceRoot%%CodeDir%" "%TargetTempRoot%%ProjectName%\%CodeDir%\" /Y /E /Q
        /Y 用于默认覆盖复制 
        /Q 复制时不显示文件名
        /S 复制文件夹
    解决复制问题后,我们的批处理就有了实现基础
2. 数据库备份
    直接COPY mdb文件系统会提示【文件已经被占用】,而无法复制成功。要解决这个问题,可以采用二种解决
    a. 利用osql + sqlScript 进行数据库备份,再copy备份文件
        osql -S [服务器名] -U [用户名] -P [登录密码] < [SqlScript文件]
    b. 关闭SQLServer服务,复制mdb文件
        net stop [SQLSERVER_ServiceName]
        XCOPY [数据库源文件目录] [数据库目标文件目录]/Y /E /Q
        net start [SQLSERVER_ServiceName]
3. 压缩打包文档
    利用winrar的命令行调用,达到对目标文件夹进行压缩的目的
    CALL [WINRAR程序路径] a [压缩后文件包名] @[压缩目标文件]
4. 将压缩包复制到云盘目录下,利用云盘自动进行上传备份    

C. bat详解
    附件为我的测试目录,为减少附件大小,将所有文档都删除只保留了基本目录结构
1. 变量详解
    SourceRoot :源文件根目录
    TargetTempRoot : 目标临时文件夹
    ProjectName : 项目名称
    CodeDir : 源代码根目录文件夹名
    DataBaseDir : 数据库根目录文件夹名
    DocumentsDir : 文档根目录文件夹名
    OtherDir : 其它根目录文件夹名
    WebDir : Web项目根目录文件夹名
    SQLSERVER : SQLServer服务名
    YUNPANPATH : 360云盘目标路径

2. 功能分析
    a. 备份代码 & 数据库
        COPY_CODE_PRO子处理:    
                XCOPY "%SourceRoot%%CodeDir%" "%TargetTempRoot%%ProjectName%\%CodeDir%\" /Y /E /Q /EXCLUDE:exceed
                /EXCLUDE :[文件名] 排除含有字符串的文件列表  每个字符串单独一行
                可利用此选项排除一些不需要项目bin/obj文件 备份的临时文件夹,上传文件目录
                项目中TempFile为临时上传文件夹、Upload&PackData为上传/打包文件夹
        重新建立这些目录
          COPY /Y %SourceRoot%exceed %TargetTempRoot%%ProjectName%\%CodeDir%\%CodeSourceDir%\
CD %TargetTempRoot%%ProjectName%\%CodeDir%\%CodeSourceDir%\
for /F "eol=; tokens=1,3* delims=,- skip=2" %%i in (exceed) do MD "%%i"
DEL %TargetTempRoot%%ProjectName%\%CodeDir%\%CodeSourceDir%\exceed"
        
    b. 功能选择
          根据输入的功能名进行备份
          SET FUNNUM=!CHOOCEFUN!
IF /i "%FUNNUM%"=="1" (
CALL :COPY_CODE_DATABASE
)
IF /i "%FUNNUM%"=="2" (
CALL :COPY_DOC_OTHER
)
IF /i "%FUNNUM%"=="3" (
CALL :COPY_CODE_DATABASE
CALL :COPY_DOC_OTHER
)

            
    c. 【参数执行】 与 【功能选择】 并存
SET CHOOCEFUN=
ECHO "parma1 %1"
::ECHO "Choo1 !CHOOCKFUN!"
SET CHOOCEFUN=%1
::ECHO "Choo2 !CHOOCKFUN!"
IF "%1"=="" (
ECHO  ┌──────────────────────────────────────┐
ECHO  │ "chooce bak bat function"
ECHO  │ "1 Only Code & DataBase"
ECHO  │ "2 Only Docments & Other"
ECHO  │ "3 All file"
ECHO  └──────────────────────────────────────┘
SET /P CHOOCEFUN=
)            
            BakCode.bat / BakDoc.bat / BakAll.bat  对应于三种功能的执行bat
            也可执行Bak.bat进行功能选择执行
    d. 变量延迟
        批处理读取命令时是按行读取的(另外例如for命令等,其后用一对圆括号闭合的所有语句也当作一行),在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。而为了能够感知环境变量的动态变化,批处理设计了变量延迟。简单来说,在读取了一条完整的语句之后,不立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值,也就是说“延迟”了对变量的赋值。
        变量延迟的启动语句是“setlocal enabledelayedexpansion”,并且变量要用一对叹号“!!”括起来(注意要用英文的叹号),否则就没有变量延迟的效果。 参见 http://www.cnblogs.com/glaivelee/archive/2009/10/07/1578737.html 中变量延迟的说明
    e. 其他
        GOTO :EOF   返回上处调用的结束部分
        mode con     定义显示模式
        if使用()执行多条命令时 、
    a. 命令行之间不允许有空行
    b."("前必须有空格 
    c. 命令可以使用tab进行格式化调整




Bak.bat文件源码
@echo off SETLOCAL ENABLEDELAYEDEXPANSIONmode con cols=113::save current pathSET SourceRoot=%cd%\SET TargetTempRoot=F:\Temp\::set base variablesSET ProjectName=BSASET CodeDir=CodeSET DataBaseDir=DataBaseSET DocumentsDir=DocumentsSET OtherDir=OtherSET CodeSourceDir=BSA_OnlineSET WebDir=BSASET SQLSERVER=MSSQLSERVERSET YUNPANPATH=G:\360yunpan\SET CHOOCEFUN=ECHO "parma1 %1"::ECHO "Choo1 !CHOOCKFUN!"SET CHOOCEFUN=%1::ECHO "Choo2 !CHOOCKFUN!"IF "%1"=="" (ECHO  ┌──────────────────────────────────────┐ECHO  │"chooce bak bat function"ECHO  │"1 Only Code & DataBase"ECHO  │"2 Only Docments & Other"ECHO  │"3 All file"ECHO  └──────────────────────────────────────┘SET /P CHOOCEFUN=)SET FUNNUM=!CHOOCEFUN!IF /i "%FUNNUM%"=="1" (CALL :COPY_CODE_DATABASE)IF /i "%FUNNUM%"=="2" (CALL :COPY_DOC_OTHER)IF /i "%FUNNUM%"=="3" (CALL :COPY_CODE_DATABASECALL :COPY_DOC_OTHER)CALL :ZIPPACK_PROECHO ------------------------------------------------------ECHO delete temp project dirRD /s /q "%TargetTempRoot%%ProjectName%\"SETLOCAL DISABLEDELAYEDEXPANSION:QUITECHO  ┌──────────────────────────────────────┐ECHO  │  FinishedECHO  └──────────────────────────────────────┘PAUSE & EXIT::------------------------------------------------------:COPY_CODE_DATABASECALL :COPY_CODE_PRO::CALL :CLEAR_CODE_PROCALL :COPY_DATABASE_PROGOTO :EOF:COPY_DOC_OTHERCALL :BAKDOC_PROCALL :BAKOTHER_PROGOTO :EOF:COPY_CODE_PROECHO ------------------------------------------------------ECHO start copy codeXCOPY "%SourceRoot%%CodeDir%" "%TargetTempRoot%%ProjectName%\%CodeDir%\" /Y /E /Q /EXCLUDE:exceed::/EXCLUDE:exceed::ECHO "%SourceRoot%exceed"::ECHO "%TargetTempRoot%%ProjectName%\%CodeDir%\%WebDir%\"COPY /Y %SourceRoot%exceed %TargetTempRoot%%ProjectName%\%CodeDir%\%CodeSourceDir%\CD %TargetTempRoot%%ProjectName%\%CodeDir%\%CodeSourceDir%\for /F "eol=; tokens=1,3* delims=,- skip=2" %%i in (exceed) do MD "%%i"DEL %TargetTempRoot%%ProjectName%\%CodeDir%\%CodeSourceDir%\exceed"GOTO :EOF:COPY_DATABASE_PRO::ECHO ------------------------------------------------------::ECHO start bak database file::osql -S NICK-PC\SQLEXPRESS -U sa -P 1234 < "%SourceRoot%backupBSADataBase.sql"ECHO ------------------------------------------------------ECHO close sqlserver servicenet stop %SQLSERVER%ECHO ------------------------------------------------------ECHO start copy database XCOPY "%SourceRoot%%DataBaseDir%" "%TargetTempRoot%%ProjectName%\%DataBaseDir%\" /Y /E /QECHO ------------------------------------------------------ECHO open sqlserver servicenet start %SQLSERVER%GOTO :EOF:BAKDOC_PROECHO ------------------------------------------------------ECHO start copy docmentsXCOPY "%SourceRoot%%DocumentsDir%" "%TargetTempRoot%%ProjectName%\%DocumentsDir%\" /Y /E /QGOTO :EOF:BAKOTHER_PROECHO ------------------------------------------------------ECHO start copy otherXCOPY "%SourceRoot%%OtherDir%" "%TargetTempRoot%%ProjectName%\%OtherDir%\" /Y /E /QGOTO :EOF:ZIPPACK_PROECHO ------------------------------------------------------ECHO start zip filesCD %TargetTempRoot%COPY "%SourceRoot%zip.lst"CALL "C:\Program Files\WinRAR\rar.exe" a %ProjectName% @zip.lstDEL zip.lstCALL :COPY_360_PROGOTO :EOF:COPY_360_PROSET D=%date:~0,4%%date:~5,2%%date:~8,2%SET T=%time:~0,2%%time:~3,2%%time:~6,2%COPY "%ProjectName%.rar" "%YUNPANPATH%%ProjectName%_%D%_%T%.rar"DEL %ProjectName%.rarGOTO :EOF::useless cancellation:CLEAR_CODE_PROECHO ------------------------------------------------------ECHO start clear temp codeCD %TargetTempRoot%%ProjectName%\%CodeDir%\%CodeSourceDir%\for /r . %%a in (.) do @if exist "%%a\bin" rd /s /q "%%a\bin" for /r . %%a in (.) do @if exist "%%a\obj" rd /s /q "%%a\obj"CD %WebDir%\RD /s /q "TempFile"RD /s /q "Upload"RD /s /q "PackData"MD "TempFile"MD "Upload"MD "PackData"MD "PackData\Mails"GOTO :EOF

整个项目已经发布到百度云 http://yun.baidu.com/share/link?shareid=3004039338&uk=2650878897
欢迎大家下载试用




原创粉丝点击