1. 程式人生 > >用批處理檔案自動備份檔案及資料夾,並自動刪除n天前的檔案_DOS/BAT

用批處理檔案自動備份檔案及資料夾,並自動刪除n天前的檔案_DOS/BAT

下是備份的批處理,新增到”計劃任務”中,設定時間自動執行
程式碼如下:

@echo off 
rem 格式化日期 
rem date出來的日期是"2006-02-22 星期三",不能直接拿來使用,所以應該先格式化一下 
rem 變成我們想要的。date:~0,4的意思是從0開始擷取4個字元 
set d=%date:~0,4%%date:~5,2%%date:~8,2% 
rem 設定壓縮程式路徑,這裡用的是WINRAR的rar.exe進行打包的 
set path=C:\Program Files\WinRAR 
rem 設定要備份的目錄 
set srcDir=D:\databasc 
rem 設定備份檔案所在目錄 
set dstDir=E
:\temp\backup rem 設定備份檔案的字首,目前為temp,字首為backup set webPrefix= rem 如果檔案不存在,開始備份 if not exist %dstDir%%webPrefix%%d%.rar start Rar a -r %dstDir%%webPrefix%%d%.rar %srcDir% @echo on

以下是刪除N天前備份檔案的批處理,注:在windows2003下,如XP下因為沒有forfiles.exe,未測試拷貝2003的檔案到XP的system32目錄

刪除在C盤backup目錄下最後修改日期在10天前的檔案

forfiles /p "c:\backup"
/d -10 /c "cmd /c echo deleting @file ... && del /f @path"

=================================================================================
以下是複製某天前檔案到其它位置的批處理

要把在C盤根目錄下最後修改日期大於或等於2007年7月1日的檔案複製到D盤根目錄下

forfiles /p "c:\" /d "2007-7-1" /c "cmd /c copy @path d:\" 

Windows Server 2003內建的命令列檔案,適合於XP以上系統
示例:

forfiles /m *.bkf /d -28 /c "cmd /c del @file /f" 

刪除當前目錄下28天以前的副檔名為bkf檔案(以當前系統時間為基準)
forfiles 自動刪除7天前檔案 delete
2008-09-12 15:01
用forfiles.exe試試。

forfiles /p "d:\test" /s /m *.* /d -7 /c "cmd /c del @path" 

做成批處理檔案,bat檔案與forfiles.exe同一目錄下,建一個bat檔案的快捷方式在啟動。
d:\test換成你要的目錄路徑。日期是指修改的日期。
附上forfiles.exe及幫助。
刪除所有的空目錄(以刪除d:\test目錄下為例)

dir /ad/b/s d:\test\ |sort /r >d:\kill.txt 
For /f "tokens=*" %%i in (d:\kill.txt) DO rd "%%i" 
del d:\kill.txt 

把以下複製到bat檔案中。

@echo off 
forfiles /p "d:\test" /s /m *.* /d -7 /c "cmd /c del @path" 
dir /ad/b/s d:\test\ |sort /r >d:\kill.txt 
For /f "tokens=*" %%i in (d:\kill.txt) DO rd "%%i" 
del d:\kill.txt 

先刪過期檔案,再刪所有的空目錄
如果作業系統是 Windows Server 2003 那就好辦了,因為它有一個forfiles命令能夠查詢滿足指定條件的檔案,下面是這個命令的用法。

forfiles /p <目標目錄名> /d <天數> /c <執行的命令> 

看看列出的三個引數都有什麼用處:
/p 指定了要在哪個目錄裡查詢檔案,預設是當前工作目錄。
/d 指定一個日期或天數,用於比較檔案的最後修改日期是否符合條件。
/c 對每個找到的檔案執行的命令。
例1.要把在C盤根目錄下最後修改日期大於或等於2007年7月1日的檔案複製到D盤根目錄下:

forfiles /p "c:\" /d "2007-7-1" /c "cmd /c copy @path d:\" 

例2.刪除在C盤backup目錄下最後修改日期在10天前的檔案:

forfiles /p "c:\backup" /d -10 /c "cmd /c echo deleting @file ... && del /f @path" 

先看刪除檔案的程式碼

forfiles /p 包含要刪除檔案的完整路徑(如:F:\Logfiles) /m *.log -d -7 /c "cmd /c del /f @path" 

解釋一下相關引數及命令
/p : 指定開始搜尋檔案的位置,如果不指定則預設為當前目錄。
/m : 檔案查詢所使用的萬用字元如程式碼中的”.log”則為所有日誌檔案,當然也可以指定諸如”manmee_.log”這樣以manmee開頭的所有日誌檔案。如果不指定此引數則預設為”.“。
/d [{+|-}][{|}] : 指定想選擇檔案的最後修改時間,上文中用了 “/d -7” 表示所有以當天為基礎,7天以前的檔案。當然這裡還可以指定具體時間,例如:”/d -08/18/2009”這樣所有早於2009年8月18日的檔案。注意指定的時間必須是”MM/DD/YYYY”的格式。
/c 對所有檔案以此執行指定的命令,命令體須在雙引號(“)內,預設是”cmd /c echo @file”。上文中用到的是”cmd /c del /f @path”刪除指定檔案。(這裡的@file 和 @path 為變數,下文中將解釋。)
下面說一下上文中用到的引數:
@PATH : 表示檔案的完整的路徑。
@File : 表示檔名稱。
其他引數的詳細介紹點選這裡。
接下來我們看看刪除資料夾的操作,如果你看了上面的介紹,相信這命令你一看就能看懂。
forfiles /p 包含資料夾的路徑(如:F:) /m 資料夾名稱(如:LogFiles) -d 0 /c “cmd /c if @ISDIR == true rd /s/q @path”
注意這裡的”包含資料夾的路徑”不能包含要刪除的資料夾,如以上程式碼所表示的就是,在F盤中查詢名為LogFiles的檔案或資料夾(不能指定查詢資料夾,不過在刪除時我們做了判斷)。
還有就是這裡出現了一個新的引數”@ISDIR”他用於判斷當前檔案型別是否是”資料夾型別”,如果是則為true否則為false。
相信到這大家就明白了,最後再將程式碼儲存為批處理檔案,然後加入計劃任務定期執行即可。
看了上面的例子,覺得在 Windows Server 2003 下面要刪除老檔案很簡單吧。
但如果作業系統是 Windows 2000/XP 就比較麻煩,因為它們沒有forfiles命令,只能靠自己寫批處理來實現了。
下面是我寫的批處理檔案內容:
程式碼如下:

@echo off 
rem ****************************** 
rem * 按時間刪除檔案目錄的批處理 * 
rem ****************************** 
rem 設定臨時目錄的路徑 
set tempDir=%tmp%\remove_%date:~0,10% 
if not exist %tempDir% md %tempDir% 
rem 設定處理日期的指令碼檔案的路徑 
set scriptFile=%tempDir%\get_date.vbs 
rem 獲得要保留的天數 
set days=%~1 
if "%days%" == "" goto printUsage 
rem 獲得目標目錄的路徑 
set dirPath=%~2 
if "%dirPath%" == "" set dirPath=. 
rem 獲得要操作的檔案形式 
set fileSpec=%~3 
if "%fileSpec%" == "" set fileSpec=*.* 
rem 生成計算日期的指令碼檔案並獲得刪除的截止日期 
echo d=date()-%1 > %scriptFile% 
echo s=right("0000" ^& year(d),4) ^& "-" ^& right("00" ^& month(d),2) ^& "-" ^& right("00" ^& day(d),2) >> %scriptFile% 
echo wscript.echo s >> %scriptFile% 
for /f %%i in ('cscript /nologo %scriptFile%') do set lastDate=%%i 
rem 處理目標目錄裡的每個物件 
for /f "tokens=1,2,3* delims=<> " %%i in ('dir "%dirPath%\%fileSpec%" /a /-c /tc') do call :proc "%%i" "%%j" "%%k" "%%l" 
goto :done 
rem 處理目標目錄裡物件的過程 
:proc 
rem 獲得物件的建立日期並判斷是否為有效格式 
set fileDate=%~1 
echo %fileDate% | findstr "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]" > nul 
if errorlevel 1 goto end 
rem 獲得物件的型別 
set fileType=%~3 
if "%fileType%" == "" goto end 
rem 獲得物件的名稱 
set fileName=%~4 
if "%fileName%" == "" goto end 
if "%fileName%" == "." goto end 
if "%fileName%" == ".." goto end 
if "%fileName%" == "位元組" goto end 
if "%fileName%" == "可用位元組" goto end 
rem 判斷物件日期是否小於或等於刪除的截止日期 
if "%fileDate:~0,10%" leq "%lastDate%" ( 
echo deleting "%fileName%" ... 
if "%fileType%" == "DIR" ( rd /s /q "%dirPath%\%fileName%" ) else ( del /q /f "%dirPath%\%fileName%" ) 
) 
goto end 
:error 
echo An error occurred during backuping. 
:done 
rd /s /q %tempDir% 
goto end 
:printUsage 
echo Usage: %0 ^<Days^> [Work directory] [Target file specification (can include wildcards)] 
goto end 
:end 

主要是利用Windows的指令碼功能來計算要刪除檔案的截止日期,然後for加dir命令來提取檔案的日期進行判斷。
關於forfiles和for的詳細資訊,可以在Windows的幫助與支援中找到。