使用forfiles删除文件夹及其内容

我试图清除一个公共目录,所以当一个项目超过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