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_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 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
欢迎大家下载试用
- Bat应用 - 备份项目
- ping_with_time.bat 备份bat
- mysql备份bat备份脚本
- mysql备份bat备份脚本
- bat实现mysql备份
- 文件备份bat脚本
- 文件目录备份bat
- SQLServer2008 编辑bat备份
- 数据库备份 bat
- mysql bat 自动备份
- bat复制备份
- bat自动备份压缩文件
- 文件夹备份脚本.bat
- bat移动应用及开源项目解析
- 编写自动备份bat脚本
- windows下bat备份mysql
- bat文件备份MySQL数据库
- SQL完整备份 wz_Backup.bat
- system v--消息队列
- 字符识别?
- 用poi包填充excel中单元格 颜色效果
- 收集的名称
- 插件Discuz版本号兼容
- Bat应用 - 备份项目
- 新的开始
- 钽电容基本知识
- HBase在淘宝主搜索的Dump中的性能调优
- sql语句的执行顺序
- java遍历一个文件夹下面的所有文件
- assert用法总结
- 触发器
- uva 301 Transportation