使用 forfiles 删除文件夹及其内容
Use forfiles to delete a folder and its contents
我正在尝试清除 public 目录,因此当项目超过 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
,不删除文件夹。
我是否必须检查文件夹是否为空,然后使用另一个命令删除文件夹?
您正在使用的命令行非常危险(我只是将其复制到此处并重新排序了开关):
forfiles /S /D -30 /P "C:\PATH\USERS\PATH\" /M "*.*" /C "cmd /C del /Q @path"
因为forfiles
returns既是文件又是目录。假设有一个名为 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
将 return 一个目录 在 它 return 它的子项之前,检查是否没有意义该目录为空或不在同一命令行中,您需要稍后再做。
为此,您可以像这样使用第二个 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
命令
for /D %I in ("%cd%\*") do rd "%~fI" 2> nul
对于bat文件
for /D %%I in ("%cd%\*") do rd "%%~fI" 2> nul
我正在尝试清除 public 目录,因此当项目超过 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
,不删除文件夹。
我是否必须检查文件夹是否为空,然后使用另一个命令删除文件夹?
您正在使用的命令行非常危险(我只是将其复制到此处并重新排序了开关):
forfiles /S /D -30 /P "C:\PATH\USERS\PATH\" /M "*.*" /C "cmd /C del /Q @path"
因为forfiles
returns既是文件又是目录。假设有一个名为 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
将 return 一个目录 在 它 return 它的子项之前,检查是否没有意义该目录为空或不在同一命令行中,您需要稍后再做。
为此,您可以像这样使用第二个 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
命令
for /D %I in ("%cd%\*") do rd "%~fI" 2> nul
对于bat文件
for /D %%I in ("%cd%\*") do rd "%%~fI" 2> nul