备份用批处理

1 环境

操作系统:Windows Server 2003 SP2 简体中文版

2 备份

2.1 批处理

重命名现有文件,加上当天日期。sampledb重命名后会变为sampledb_2014-09-18。

@echo off  
::备份sampledb数据库
::给数据库备份文件添加备份日期   
  
rem 指定需要备份的源文件名 
set SrcFile1=E:\backup\sampledb
rem 指定目标文件名(部分)
set DstFile1=sampledb

rename %SrcFile1% %DstFile1%_%date:~0,10%

2.2 解释

@
在执行时不显示它后面这一行命令本身。就本例来说,批处理执行时让屏幕上不显示echo off。
echo off
关闭命令行回显。让这一行之后的所有命令在执行时屏幕上都不显示内容(echo命令除外)。
::
注释。批处理中的说明性文字,以它打头的行不做任何操作,也不会在屏幕上显示。
rem
注释,作用与::相同。区别是批处理执行时以它打头的内容会显示在屏幕上。
set
设置环境变量,以便后续使用。
%SrcFile1%
调用环境变量。
%date:~0,10%
“date”是存储当前日期的环境变量。引用环境变量时使用“:~x,y”可对其值进行截取。x表示偏移,y表示截取多少个字符。比如date变量的值是“2014-09-18 星期四”,%date:~0,10%的结果会是2014-09-18。x还可以是负值,表示从尾部截取。假设abc的值是12345,%abc:~-2,2%的结果会是45。

3 删除

3.1 批处理

根据文件名中的日期字符串删除指定天数前的文件。

@echo off
::演示:删除指定路径下指定天数之前(以文件名中包含的日期字符串为准)的文件。
::如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
::本例假设文件名中包含日期字符串,适用的文件名格式是:sampledb_2014-09-18

rem 指定待删除文件的存放路径
set SrcDir=C:/Test/BatHome
rem 指定天数
set DaysAgo=1

>"%temp%/DstDate.vbs" echo LastDate=date()-%DaysAgo%
>>"%temp%/DstDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day(LastDate),2)
>>"%temp%/DstDate.vbs" echo wscript.echo FmtDate
for /f %%a in ('cscript /nologo "%temp%/DstDate.vbs"') do (
  set "DstDate=%%a"
)
set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%

setlocal enabledelayedexpansion
for /r "%SrcDir%" %%a in (*.*) do (
    set "FileDate=%%~na"
    set "FileDate=!FileDate:~9,10!"
    if "!FileDate!" leq "%DstDate%" (
        if exist "%%a" (
            echo del /f /q "%%a"
        )
    )
)
endlocal
pause

3.2 解释

"%temp%/DstDate.vbs" echo ...
这3条语句在临时目录生成一个vbs脚本,用来计算DaysAgo天前的日期。比如今天是2014年9月18日,计算后的结果(FmtDate变量值)是20140908。^是cmd中的转义符,用来取消&的特殊含义。
for /f %%a in ('cscript /nologo "%temp%/DstDate.vbs"') do ( set "DstDate=%%a" )
用来把vbs脚本的日期值赋给环境变量“DstDate”,因为一个命令的输出结果无法直接赋给环境变量(如果说错请指出)。“/F”参数表示用文件解析来处理命令输出、字符串或文件内容。文件解析指读取输出、字符串或文件内容,把它拆分为一行行的文本,再把每一行解析成0个或多个token,然后调用for循环,把token赋值给迭代变量。/F默认传递每个文件每一行的第一个由空字符隔开的token,跳过空行。本例中用其处理vbs脚本的输出,完整句法是

for /F ["ParsingKeywords"] {%% | %}variable in ('command') do command [CommandLineOptions]

“ParsingKeywords”用来改变默认的解析行为,本例未用到;“%%variable”是批处理中使用的变量形式,“%variable”是直接在cmd窗口中使用的变量形式;“command”是需要处理其输出的命令;“do”后面是需要执行的操作。

set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%
DstDate.vbs脚本输出的日期格式为20140918,本句把格式改为2014-09-18,加上了“-”符号。
setlocal enabledelayedexpansion
endlocal
“setlocal”用来启用局部环境变量,在遇到“endlocal”或在批处理执行完毕时结束。“enabledelayedexpansion”表示启用延迟环境变量扩展。在cmd执行命令前会对脚本进行预处理,其中有一个过程是变量识别,在这个过程中,如果有两个%括起来的如%value%这样的变量,会查找其对应值,然后用值替换掉这个变量,这个替换的过程,就叫做变量扩展。替换后才会执行命令。比如以下面内容创建批处理

set k=123
echo %k%

执行时屏幕上会显示

E:\>set k=123

E:\>echo 123
123

我们并没有在批处理中使用echo 123,这表明至少在执行到echo %k%这句时,对变量进行了值的替换(即变量的扩展)。 for语句中有时需要对变量动态赋值,但默认的变量扩展行为会使赋值操作无效,不论如何赋值,变量始终是其初始值(若变量未赋值,则值为空)。变量的延迟扩展即用来解决这一问题。启用变量延迟扩展后,要使用“!k!”格式引用变量才能达到想要的效果。

for /r "%SrcDir%" %%a in (*.*) do (...)
“/R”表示递归,在目录树中的每一个目录都执行for命令。这条语句的作用,是把文件名中的日期提取出来,然后与DstDate进行比对,如果日期等于或小于DstDate,则执行删除操作。
set "FileDate=%%~na"
“%%~na”表示只使用变量a中的文件名,去掉扩展名。
if "!FileDate!" leq "%DstDate%" (...)
若“!FileDate!”小于或等于“%DstDate%”,则执行括号中命令。
if exist "%%a" ()
若“%%a”这个文件名存在,则执行括号中命令。

4 附录

4.1 VBS文件解析

3.1 批处理所示批处理中会生成一个vbs脚本,内容如下(为使此vbs能够独立运行,对原代码进行了少许修改):

DaysAgo=1
LastDate=date()-DaysAgo
FmtDate=right(year(LastDate),4) & right("0" & month(LastDate),2) & right("0" & day(LastDate),2)
wscript.echo FmtDate
DaysAgo=1
LastDate=date()-DaysAgo
赋值语句。
date()
函数,返回系统当前日期,格式是2014-9-18,只有1位数字的月日前不会补0。
FmtDate=right(year(LastDate),4) & ...
“right(string, length)”函数,从字符串右边返回指定数目的字符;连接运算符“&”,强制两个表达式进行字符串连接。本句的目的,是把日期格式变为20140918,月日如果只有1位数字则补零,并去掉“-”字符。
wscript.echo FmtDate
“wscript.echo”是WScript Object中的WScript Echo方法,用来显示信息。直接运行会弹出一个窗口显示,通过cscript命令运行会在命令行显示。

4.2 参考文档

4.2.1 批处理获取当前时间

4.2.2 批处理中setlocal enabledelayedexpansion的作用详细整理

4.2.3 【日期时间】批处理删除指定天数日期之前的文件 

4.2.4 批处理经典入门教程!(从不懂到高手)

4.2.5 Command-line reference A-Z

点击量:75

发表评论

电子邮件地址不会被公开。 必填项已用*标注

5 × 5 =