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

时间:2016-09-07 19:02:57

标签: windows batch-file

我正在尝试清除公共目录,因此当项目超过30天时,应将其删除。我使用以下命令设置了批处理文件:

forfiles /p "C:\PATH\USERS\PATH\" /s /m *.* /c "cmd /c Del @path /q" /d -30

这很有效。但问题是,它只删除路径中文件夹中的项目。

示例:C:\PATH\USERS\PATH\HelloWorld\file.text已超过30天。但该命令仅删除file.text,而不删除文件夹。

我是否必须检查该文件夹是否为空,然后使用其他命令删除该文件夹?

2 个答案:

答案 0 :(得分:4)

您使用的命令行非常危险(我只是将其复制并重新排序):

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,删除 all 中的文件,即使是那些不符合搜索条件的文件(请注意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

答案 1 :(得分:0)

对于 cmd

for /D %I in ("%cd%\*") do rd "%~fI" 2> nul

用于bat文件

for /D %%I in ("%cd%\*") do rd "%%~fI" 2> nul