2017-09-04 103 views
0

我有一個腳本會從嵌套文件結構中刪除所有超過31天的文件。使用批處理文件刪除子文件夾中的所有空文件夾?

在某些時候,它會留下空文件夾,我正在尋找一種方法來刪除它們,最好保留比31天更新的文件夾。鑑於rd FolderName不會刪除文件夾,如果它不是空的,我可以用它來刪除文件夾。問題是,如果我這樣做,它不會刪除所有空文件夾,只有樹中最深的文件夾。如果我可以將文件的名單反轉給我,它就會起作用。如果這不可能,還有另一種方法嗎?

注意:rd/s不會刪除嵌套的文件夾,但也會刪除其文件。如果文件夾不爲空,我不想刪除該文件夾。

這裏是我的腳本:

@echo off 
cd /d "C:\MyPath" 

:: remove files that are older than 31 days (retention period) 
forfiles /s /d -31 /c "cmd /c if @isdir==FALSE del @relpath") 

:: attempt to remove folders (will fail if the folder is not empty.) 
forfiles /s /d -31 /c "cmd /c if @isdir==TRUE rd @relpath" 

以上腳本將只刪除最深的文件夾。我想我可以連續執行8次文件,但這是對資源的嚴重浪費。

+0

'SORT'有'/ r'選項... – Magoo

+0

@Magoo有趣。現在我必須弄清楚如何使用我的腳本工作。 forfiles | sort/r的作品,但我如何執行一個命令呢?如果你有答案,隨時給我寫一個答案,我會很樂意給你一票和檢查。 :) – LPChip

+0

'for/f「delims =」%% a in('dir/s/b/ad「C:\ mypath」^ | sort/r')do echo %% a'會產生一個基本的目錄列表目錄的子目錄,然後對其進行反向排序,以便任何目錄名顯示*在列表中的子目錄之後。 – Magoo

回答

0

在@Magoo的幫助下,我指出可以使用sort/r來反轉列表,我設法找到了一個解決方案。

使用的代碼如下:

@echo off 
cd /d "C:\MyPath" 

:: remove files that are older than 31 days (retention period) 
forfiles /s /d -31 /c "cmd /c if @isdir==FALSE del @relpath") 

:: attempt to remove folders (will fail if the folder is not empty.) 
for /f %%i IN ('forfiles /s /d -31 /c "cmd /c if @isdir==TRUE echo @relpath" ^|sort /r') DO rd %%i 
+0

你的答案不符合你自己的問題標準,它只會刪除在過去30天內沒有被修改的目錄,並且沒有內容。您想刪除過去30天內未修改過的所有文件,然後刪除所有沒有內容的年齡的所有目錄。 – Compo

+0

@compo我的答案中添加的行是我腳本的最後一行。我可以在我的答案中複製腳本的文本,但似乎過度。但如果它讓你開心,我會編輯腳本來添加它。 – LPChip

1

爲了除去沒有內容的目錄下面,如已經@Magoo暗示將是更好的,比你自己的答案要快得多:

FOR /F "DELIMS=|" %%A IN ('DIR/B/S/AD-S-L^|SORT/R') DO RD "%%A" 2>NUL 
+0

你能解釋爲什麼它更快嗎?此外,它不會排除空的但比31天更新的文件夾。 – LPChip

+0

我剛剛注意到我的問題沒有說明如果可能,我想在31天內保留空文件夾。我會編輯它。但如果表現非常不同,我可能會選擇忽略這31天。 – LPChip

+0

你的問題沒有規定你希望在樹中保留空目錄長達31天!請相應地編輯(https://stackoverflow.com/posts/46033592/edit)您的問題,然後接受您自己的答案作爲解決方案。 – Compo

相關問題