一、需求介绍:
最近客户提出一个需求:在一台windows 2000 Server的服务器上写一个脚本:删除指定目录下N天前创建的文件、目录。由于该服务器并没有安装任何的开发平台,所以只能依靠Windows自带的批处理命令和VBS脚本来完成这个功能了。
二、代码示例及分析:
由于以前没有接触过Windows批处理命令,所以临时从网上找了一个例子,下面你看到的代码大部分就是来自于这个例子(除了绿色高亮处等处)。这个cmd文件分为两部分,首先生成一个vbs脚本文件,这个脚本文件用于计算删除的截止时间,然后递归地在指定目录下搜索符合条件的资源,删除它之后写入日志文件delete_log.log。
@echo off
attrib +r del_day.cmd【1】
>t_day.vbs echo ' Yesterday.vbs, Version 1.01
>>t_day.vbs echo '
>>t_day.vbs echo ' Written by Rob van der Woude
>>t_day.vbs echo ' http://www.robvanderwoude.com
>>t_day.vbs echo '
>>t_day.vbs echo ' Calculate yesterday's date
>>t_day.vbs echo dtmYesterday = DateAdd("d",-%1,Date)
>>t_day.vbs echo '
>>t_day.vbs echo ' Get yesterday's year
>>t_day.vbs echo strYear = DatePart("yyyy",dtmYesterday)
>>t_day.vbs echo '
>>t_day.vbs echo ' Get yesterday's month, add leading zero if necessary
>>t_day.vbs echo If DatePart("m",dtmYesterday) ^< 10 Then
>>t_day.vbs echo strMonth = 0 ^& DatePart("m",dtmYesterday)
>>t_day.vbs echo Else
>>t_day.vbs echo strMonth = DatePart("m",dtmYesterday)
>>t_day.vbs echo End If
>>t_day.vbs echo '
>>t_day.vbs echo ' Get yesterday's day, add leading zero if necessary
>>t_day.vbs echo If DatePart("d",dtmYesterday) ^< 10 Then
>>t_day.vbs echo strDay = 0 ^& DatePart("d",dtmYesterday)
>>t_day.vbs echo Else
>>t_day.vbs echo strDay = DatePart("d",dtmYesterday)
>>t_day.vbs echo End If
>>t_day.vbs echo '
>>t_day.vbs echo ' Format output for yesterday
>>t_day.vbs echo strYest = strYear ^& strMonth ^& strDay【2】
>>t_day.vbs echo '
>>t_day.vbs echo ' echo
>>t_day.vbs echo Wscript.echo( strYest )
@echo on
set dirPath=%~1
cd dirPath
del /q delete_log.log
for /f "delims=" %%i in ('cscript.exe //nologo t_day.vbs') do set t_day=%%i && echo delete files or directories which last modified date before date: %%i >> delete_log.log && echo ================================================ >> delete_log.log
setlocal ENABLEDELAYEDEXPANSION
for /r %%i in (*.*) do set c_day=%%~ti && if "!c_day:~6,2!!c_day:~0,2!!c_day:~3,2!" lss "%t_day:~2,6%"【3】 echo delete file : "%%i" Last Modified day is : "%%~ti" >>delete_log.log && del /q "%%i" 【4】
endlocal
@echo =========================
@echo 删除完毕.
@echo =========================
cls
@echo off
del t_day.vbs【5】
attrib -r del_day.cmd【6】
下面重点介绍代码中绿色高亮处的作用,这是我修改例子来满足实际需要的改动:
①attrib +r del_day.cmd:
这个命令是用于改变指定文件的系统属性的,+/-分别代表增加,撤销某种属性,r/h则代表read_only和hidden。del_day.cmd则是这个脚本的名字。为什么要加上这一句呢?因为我们的这个脚本是需要删除N天前创建的文件,假如我们在一段时间后再次执行这文件,那么程序在删除其他文件的同时会连同自己一块删除,“同归于尽”了。所以要把这个文件在每次执行时变成只读的。
②strYest = strYear ^& strMonth ^& strDay:
这句话的作用很明显却是整个vbs脚本的精髓:它将前面各个部分的值拼接成类似:20080715这样的格式并返回该字符串。
③set c_day=%%~ti && if "!c_day:~6,2!!c_day:~0,2!!c_day:~3,2!" lss "%t_day:~2,6%":
这句话就是删除的条件了!首先%%~ti是拿到每个文件的“Last modified date”属性,然后赋给变量:c_day,赋值后c_day的值类似于07/15/08 16:05p。c_day:~6,2的作用是截取该变量从位置6开始的2个字符(注意从0开始计数),也就是年份08了,后面的c_day:~0,2是截取月份07,而c_day:~3,2则很明显是日期15。这一切做完后拼接起来和变量c_day的后6个字符串比较(也就是080715)。
注意:注意这里的c_day和t_day的值的格式会因为操作系统和时区、语言集的不同而不同,原代码中的if部分的逻辑和这里不同,我将其改为适合于中文的环境。
如果你不确定你本机的时间日期格式是什么,可以在DOS下执行date命令,如下图所示:
C:\Documents and Settings\qlinpen.E0015609D6309>date
The current date is: 07/15/2008 Tue
④ >>delete_log.log && del /q "%%i":
在判断文件符合删除条件后,我们首先使用echo写日志,注意>>这个重定向符的作用,它使用“append”的方式将echo输出的内容追加到文本delete_log.log文件中,&&是一个组合命令,它使到第一条命令执行成功后紧接着执行后面一条命令。但前提是第一条命令必须成功执行,如果失败了则&&后面的命令不被执行。如果你希望无论如何都要执行后面的命令,则你可以使用&代替&&。
del /q %%i这个命令中参数/q的作用是在不询问用户的情况直接删除,而且是不可恢复的删除,使用起来必须很小心。如果使用/p做参数,则在windows每次删除前会出现提示信息,在用户确认后才删除。%%i则是当前文件名的引用。
⑤del t_day.vbs:
还记得前面我们说过:这个cmd文件分为两部分,第一部分就是创建一个t_day.vbs脚本,这句话就是删除这个临时使用的vbs文件。
⑥attrib -r del_day.cmd:
在命令执行完成后,修改cmd文件的属性为可写,方便后面对程序的扩展。
结论:在可能的情况下,使用windows自带的命令和vbs脚本也可以高效、快速的完成任务,特别是对系统资源的访问、操作。
附:
①Windows批处理命令详解
②Windows 2003 Server自带的批量删除N天前文件命令
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。
posted on 2008-07-11 15:56
Paul Lin 阅读(6037)
评论(0) 编辑 收藏 所属分类:
其它技术