我试图清除一个公共目录,所以当一个项目超过30天时,它应该被删除。 我有一个batch file设置使用以下命令:
forfiles /p "C:\PATH\USERS\PATH\" /s /m *.* /c "cmd /c Del @path /q" /d -30
这很好。 但是,问题是,它只会删除path内的文件夹内的项目。
示例: C:\PATH\USERS\PATH\HelloWorld\file.text
已超过30天。 但该命令只会删除file.text
,而不是文件夹。
我需要检查文件夹是否为空,然后用另一个命令删除文件夹?
你正在使用的命令行是相当危险的(我刚刚在这里复制它,并重新排序开关):
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