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 閱讀(6061) 評論(0)  編輯  收藏 所屬分類: 其它技術
          <2008年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點博客

          好友博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 册亨县| 克什克腾旗| 贵溪市| 开阳县| 湟源县| 安达市| 饶平县| 霍城县| 新干县| 剑河县| 南涧| 万荣县| 武陟县| 邓州市| 镇安县| 眉山市| 凌云县| 民县| 宁化县| 大庆市| 黄山市| 瑞昌市| 定襄县| 普安县| 梅河口市| 高淳县| 英吉沙县| 宜君县| 高密市| 宝清县| 扶风县| 繁昌县| 志丹县| 沛县| 汶上县| 卓尼县| 柳林县| 辽阳县| 闽侯县| 西峡县| 新建县|