运用批处理解决工作项目相关源码、文档、数据库等重要文件的备份问题
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_DATABASECALL :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
欢迎大家下载试用