首先,我对此领域知识不足,对此深表歉意。我一直在使用基本的 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
与大多数内部命令不同。