Windows 使用forfiles可删除文件夹及其内容
我试图清除一个公共目录,因此当一个项目超过30天时,它应该被删除。我使用以下命令设置了批处理文件:Windows 使用forfiles可删除文件夹及其内容,windows,batch-file,cmd,forfiles,Windows,Batch File,Cmd,Forfiles,我试图清除一个公共目录,因此当一个项目超过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 /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
同时返回文件和目录。假设有一个名为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"
我还将文件掩码从*.
更改为*
,因为forfiles
与所有内部命令相反,在给定*.
的情况下,不匹配没有扩展名的文件。此外,我从路径中删除了尾随的\
,因为否则,forfiles
会引发错误:错误:T目录名无效。
但现在我们来看一个完全不同的问题——你实际问题的答案: 由于
forfiles/S
将在返回其子项之前返回目录,因此在同一命令行中检查目录是否为空没有意义,您需要稍后再执行此操作
为此,您可以像这样使用第二个For files
循环(如果愿意,还可以检查它们的上次修改日期;否则,删除/D-30
部分):
或者,如果目录修改日期不相关,您可以使用for/D
循环,这也更快:
for /D %%I in ("C:\PATH\USERS\PATH\*") do rd "%%~fI" 2> nul
对于cmd
for /D %I in ("%cd%\*") do rd "%~fI" 2> nul
用于bat文件
for /D %%I in ("%cd%\*") do rd "%%~fI" 2> nul
用于删除文件夹。它不会删除非emty文件夹,除非您给它一个
/s/q
是否要检查文件夹是否已存在30天?如果是,请使用@isdir
变量仅检查目录,然后删除目录。
for /D %I in ("%cd%\*") do rd "%~fI" 2> nul
for /D %%I in ("%cd%\*") do rd "%%~fI" 2> nul