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
Visits: 391