使用 forfiles 批量删除 7 天以上的文件

使用 forfiles 批量删除 7 天以上的文件

首先,我对此领域知识不足,对此深表歉意。我一直在使用基本的 forfiles 批处理并做了一些更改,但我无法让脚本删除文件夹。目前,它可以很好地删除所有文件(包括子文件夹中的文件),但文件夹仍为空。

例如,在项目文件夹“C:\Files\Projects\”中创建了文件和文件夹,例如:

C:\Files\Projects\1\random.txt

C:\Files\Projects\2\test\hello.xlsx

我怎样才能删除顶级目录和子文件夹中的文件以外的文件夹?

我当前的脚本将已删除的文件输出到日志文件:

forfiles /p "C:\Files\Projects" /s /m *.* /D -7 /C "cmd /c del /q /s @path" >> C:\Script\Deleted.log

非常感谢!

答案1

del命令不会删除文件夹。

要删除文件夹,您需要使用rmdir(或rd)命令。

您想删除所有空文件夹还是只删除刚刚删除文件的文件夹?在第一种情况下,您可以使用:

比使用循环等更简单的方法(或者说技巧)rd是使用命令robocopy。您要做的是将整个父文件夹移动到其自身,但添加将/S忽略空文件夹的开关,从而有效地删除它们:

Robocopy C:\Files\Projects C:\Files\Projects /S /Move

与您的文件删除命令一起将是:

forfiles /p "C:\Files\Projects" /s /m *.* /D -7 /C "cmd /c del /q /s @path" >> C:\Script\Deleted.log && Robocopy C:\Files\Projects C:\Files\Projects /S /Move >> C:\Script\Deleted.log

答案2

正如前面所说的,del命令(也erase)仅删除文件;要删除目录,请使用rd命令(还rmdir)。

forfiles具有一个名为的变量@isdir来指示当前迭代项是目录(值TRUE)还是文件(值FALSE),因此让我们利用它:

forfiles /S /P "C:\Files\Projects" /M * /D -7 /C "cmd /C if @isdir == TRUE (rd /S /Q @path) else (del /F /A @path)" >> "C:\Script\Deleted.log"

您可能想要强制删除只读文件 ( del /F) 以及删除隐藏文件 ( del /A)。

请注意,我将文件掩码从 更改*.**,因为forfiles前者不会匹配没有扩展名的文件,因为它将通配符cmd与大多数内部命令不同。

相关内容