您使用的命令行非常危险(我只是在此处复制并重新排序了开关):
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