2016-09-07 84 views
2

我試圖清除一個公共目錄,所以當一個項目超過30天時,它應該被刪除。我有一個批處理文件設置使用以下命令:用於文件刪除文件夾及其內容

forfiles /p "C:\PATH\USERS\PATH\" /s /m *.* /c "cmd /c Del @path /q" /d -30 

這很好。但是,問題是,它只會刪除路徑內文件夾內的項目。例如:C:\PATH\USERS\PATH\HelloWorld\file.text已超過30天。但該命令僅刪除file.text,而不是該文件夾。

我需要檢查文件夾是否爲空,然後用另一個命令刪除文件夾?

+2

使用[RD](http://ss64.com/nt/rd.html)刪除文件夾。它不會刪除一個非emty文件夾,除非你給它一個'/ s/q' – Stephan

+0

你想檢查文件夾是否30天?如果是這樣,則使用@ isdir變量僅檢查目錄,然後刪除該目錄。 – Squashman

回答

2

您所使用的命令行是相當危險的(我只是在這裏複製它,並重新排序的開關):

forfiles /S /D -30 /P "C:\PATH\USERS\PATH\" /M "*.*" /C "cmd /C del /Q @path" 

因爲forfiles回報文件和目錄。假設有一個名爲container的目錄與搜索條件匹配(30天前或之前修改的最後一個),執行的del命令行爲del "C:\PATH\USERS\PATH\container" /Q,其中全部爲文件,即使那些不符合搜索條件(請注意del \folder行爲如del \folder\*)。

爲了解決這個問題,需要過濾的文件或目錄,如:

forfiles /S /D -30 /P "C:\PATH\USERS\PATH" /M "*" /C "cmd /C if @isdir==FALSE del @path" 

我也改了文件掩碼從*.**,因爲forfiles,不是所有的內部命令,不在給出*.*的情況下匹配沒有擴展名的文件。另外,我從路徑中刪除了尾部的\,否則,forfiles會產生一個錯誤:ERROR: The directory name is invalid.


但現在完全不同的東西 - 回答您的實際問題:

因爲它返回它的子項之前forfiles /S會返回一個目錄,它沒有任何意義做檢查是否該目錄是空的或不在同一個命令行中,您需要稍後再做。

爲此,你可以使用一個第二forfiles環這樣的(也檢查他們的最後修改日期,如果你喜歡;否則,取出/D -30部分):

forfiles /S /D -30 /P "C:\PATH\USERS\PATH" /M "*" /C "cmd /C if @isdir==TRUE rd @path 2> nul" 

或可替代地,如果目錄修改日期是不相關的,你可以使用一個for /D循環,這也是快:

for /D %%I in ("C:\PATH\USERS\PATH\*") do rd "%%~fI" 2> nul 
相關問題