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

Wal*_*lly 3 windows batch-file

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

forfiles /p "C:\PATH\USERS\PATH\" /s /m *.* /c "cmd /c Del @path /q" /d -30
Run Code Online (Sandbox Code Playgroud)

这很好。但是,问题在于,它仅删除路径内文件夹中的项目。

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

我是否需要检查文件夹是否为空,然后使用另一个命令删除该文件夹?

asc*_*pfl 7

您使用的命令行非常危险(我只是在这里复制了它,并对开关进行了重新排序):

forfiles /S /D -30 /P "C:\PATH\USERS\PATH\" /M "*.*" /C "cmd /C del /Q @path"
Run Code Online (Sandbox Code Playgroud)

因为同时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"
Run Code Online (Sandbox Code Playgroud)

我还将文件掩码从更改*.**,因为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"
Run Code Online (Sandbox Code Playgroud)

或者,如果目录修改日期不相关,则可以使用for /D循环,该循环也更快:

for /D %%I in ("C:\PATH\USERS\PATH\*") do rd "%%~fI" 2> nul
Run Code Online (Sandbox Code Playgroud)