您所使用的命令行是相當危險的(我只是在這裏複製它,並重新排序的開關):
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
使用[RD](http://ss64.com/nt/rd.html)刪除文件夾。它不會刪除一個非emty文件夾,除非你給它一個'/ s/q' – Stephan
你想檢查文件夾是否30天?如果是這樣,則使用@ isdir變量僅檢查目錄,然後刪除該目錄。 – Squashman