您所使用的命令行是相当危险的(我只是在这里复制它,并重新排序的开关):
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