posts - 262,  comments - 221,  trackbacks - 0

一、需求介绍:

最近客户提出一个需求:在一台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 /"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 is07/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 阅读(5991) 评论(0)  编辑  收藏 所属分类: 其它技术

只有注册用户登录后才能发表评论。


网站导航:
 
<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(21)

随笔分类

随笔档案

BlogJava热点博客

好友博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜