Win2000定時刪除資料夾內所有子資料夾和檔案

yj5tm8發表於2008-03-31

請問怎樣定時刪除一個資料夾內的所有子資料夾和檔案呢?同時又要保留那個父資料夾。比如我要刪除d:test 內的所有子資料夾和檔案,但保留test這個夾子,我是win2000的域,請問怎樣實現呢?bat可以嗎?

回答:在win9x的年代,用deltree這個外部命令就很容解決這個問題,不過從windows 2000 及windows xp之後,就取消了這個命令(真的是很奇怪),那麼現在怎麼解決呢?大家可能想到用 del+rd來解決這個問題。但有個問題,就是rd命令會刪除您指定的目錄。例如,當前目錄結構如下:
D:>attrib /s /d d:test*.*
A R I D:test.txt 此檔案帶有隻讀屬性
A H I D:test.txt 此檔案帶有隱藏屬性
A S I D:test.txt 此檔案帶有系統屬性
H I D:test1 此目錄帶有隱藏屬性
A R I D:test.txt 此檔案帶有隻讀屬性
S I D:test1 此目錄帶有系統屬性
A R I D:test1.txt 此檔案帶有隻讀屬性

批處理原理如果您這麼執行命令 rd d:test,那麼rd會將test這個目錄連同其中的內容一起刪除掉,而我們要保留test這個目錄。那麼怎麼辦呢?我們可以先用del把d:test目錄下的檔案刪除掉,然後再用rd把子目錄刪除掉。這個批處理的內容如下,大家將如下內容儲存為字尾名為.bat 或者.cmd的文字檔案,例如就叫 deltree.bat吧。
---不包含此行---
attrib -s -h -r %1*.* && del %1*.* /q
dir %1 /ad /b /s >del.txt
for /f %%i in (del.txt) do rd %%i /s /q
---不包含此行---
那麼當我們需要刪除test目錄的時候,就這麼執行 "deltree.bat d:test"(不包含引號)。

批處理第一行第一行批處理中的%1就會讀取批處理引數,變成這樣 attrib -s -h -r d:test*.* && del d:test*.* /q
先用attrib 去掉test目錄下所有檔案的屬性,以保障後面的del順利執行。
&& 是連線符號,當執行完前面的命令後,執行連線符後面的命令。
del刪除 test目錄下所有檔案,因為rd命令是無法刪除test目錄下的檔案的。好,test下的檔案刪除完了,我們就開始刪除test目錄下的子目錄。

批處理第二行批處理執行到第二行,%1讀取批處理引數,就是我們在deltree後面輸入的的 d:test,變成這樣 dir d:test /ad /b /s >del.txt 這裡dir命令後的各引數含義如下:
/AD 顯示具有指定屬性的目錄。從而讓後面的rd命令刪除這些目錄
/B 使用空格式(沒有標題資訊或摘要)。避免後面的刪除命令出錯,因為dir命令還會輸出一些其它資訊,例如“ 驅動器 C 中的卷沒有標籤。 卷的序列號是 EE5B-D3AF”,顯然這會導致rd命令出錯。
/S 顯示指定目錄和所有子目錄中的檔案。輸出目錄及檔案的完整路徑,便於後面rd命令刪除。
執行完這一行批處理後,在當前目錄下會產生 del.txt檔案,您執行 type del.txt,會看到如下輸出:
d:test1
d:test1
為什麼要輸出到文字檔案呢?為什麼不直接把dir的結果輸出給rd呢?因為dir的結果會有多行,如果一行一行寫,不是太麻煩了嗎?而且將來實際運用批處理的時候,我們也無法預測目標資料夾下會有多少個子目錄。將dir結果輸出到文字檔案,然後讓rd去讀不是很方便嗎?

批處理第三行好,我們已經將要刪除的子目錄列表輸出到文字檔案del.txt中了,只要使用rd命令刪除這些目錄就好了。但實際上rd本身沒有讀取文字檔案的功能,我們用for來解決這個問題。批處理執行到了最後一行:for /f %%i in (del.txt) do rd %%i /s /q
%%i是在for語句中使用的迴圈變數,這個變數每使用一次,就從 del.txt中讀取一行,作為變數值,然後for負責將這個變數傳遞給後面 do執行的命令中,那麼for依次執行迴圈所形成的命令就是這樣的:
第一次迴圈 rd d:test1 /s /q
第二次迴圈 rd d:test1 /s /q
gnaw0725注:關於for迴圈的更多解釋請參考http://gnaw0725.blogbus.com/logs/4888698.html
這裡的rd引數含義如下:
/S 除目錄本身外,還將刪除指定目錄下的所有子目錄和檔案。用於刪除目錄樹。
/Q 安靜模式,帶 /S 刪除目錄樹時不要求確認

故障排查 好,到此位置,deltree.bat這個批處理就刪除了d:test下的所有檔案和資料夾,而無論它們帶什麼屬性。如果大家在使用這個批處理的過程中出現了問題,例如沒有刪除掉檔案,那麼如何進行故障排查呢?我們可以有兩個check point:
批處理引數獲取就是考察批處理是否正確獲取了引數,也就是我們輸入的目標資料夾,我們可以在批處理的最前面加一個echo %1 ,看看結果,就是這樣:
echo %1
attrib -s -h -r %1*.* && del %1*.* /q
gnaw0725注:批處理可以有9個引數,%0代表批處理自己,第一個引數%1,第二個%2,……依此類推
子目錄輸出列表就是del.txt,您可以輸入 type del.txt,如果正常,輸出的內容應該是d:test下的所有子目錄。

更多資訊
定時執行大家可以用at或者Schtasks或者計劃任務來定時執行上面的批處理,這樣就可以定期的刪除了。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/731863/viewspace-1001707/,如需轉載,請註明出處,否則將追究法律責任。

相關文章