一、需求介紹:
最近客戶提出一個需求:在一臺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 閱讀(6061)
評論(0) 編輯 收藏 所屬分類:
其它技術