Bat应用 - 备份项目


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

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 ENABLEDELAYEDEXPANSION
mode con cols=113
::save current path
SET SourceRoot=%cd%\
SET TargetTempRoot=F:\Temp\
::set base variables
SET ProjectName=BSA
SET CodeDir=Code
SET DataBaseDir=DataBase
SET DocumentsDir=Documents
SET OtherDir=Other
SET CodeSourceDir=BSA_Online
SET WebDir=BSA
SET SQLSERVER=MSSQLSERVER
SET 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_DATABASE
	CALL :COPY_DOC_OTHER
)

CALL :ZIPPACK_PRO

ECHO ------------------------------------------------------
ECHO delete temp project dir
RD /s /q "%TargetTempRoot%%ProjectName%\"

SETLOCAL DISABLEDELAYEDEXPANSION
:QUIT
ECHO  ┌──────────────────────────────────────┐
ECHO  │  			Finished	
ECHO  └──────────────────────────────────────┘
PAUSE & EXIT

::------------------------------------------------------

:COPY_CODE_DATABASE
CALL :COPY_CODE_PRO
::CALL :CLEAR_CODE_PRO
CALL :COPY_DATABASE_PRO
GOTO :EOF

:COPY_DOC_OTHER
CALL :BAKDOC_PRO
CALL :BAKOTHER_PRO
GOTO :EOF

:COPY_CODE_PRO
ECHO ------------------------------------------------------
ECHO start copy code
XCOPY "%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 service
net stop %SQLSERVER%
ECHO ------------------------------------------------------
ECHO start copy database 
XCOPY "%SourceRoot%%DataBaseDir%" "%TargetTempRoot%%ProjectName%\%DataBaseDir%\" /Y /E /Q
ECHO ------------------------------------------------------
ECHO open sqlserver service
net start %SQLSERVER%
GOTO :EOF

:BAKDOC_PRO
ECHO ------------------------------------------------------
ECHO start copy docments
XCOPY "%SourceRoot%%DocumentsDir%" "%TargetTempRoot%%ProjectName%\%DocumentsDir%\" /Y /E /Q
GOTO :EOF

:BAKOTHER_PRO
ECHO ------------------------------------------------------
ECHO start copy other
XCOPY "%SourceRoot%%OtherDir%" "%TargetTempRoot%%ProjectName%\%OtherDir%\" /Y /E /Q
GOTO :EOF

:ZIPPACK_PRO
ECHO ------------------------------------------------------
ECHO start zip files
CD %TargetTempRoot%
COPY "%SourceRoot%zip.lst"
CALL "C:\Program Files\WinRAR\rar.exe" a %ProjectName% @zip.lst
DEL zip.lst
CALL :COPY_360_PRO
GOTO :EOF

:COPY_360_PRO
SET 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%.rar
GOTO :EOF


::useless cancellation
:CLEAR_CODE_PRO
ECHO ------------------------------------------------------
ECHO start clear temp code
CD %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

欢迎大家下载试用




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值