Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 使用forfiles可删除文件夹及其内容_Windows_Batch File_Cmd_Forfiles - Fatal编程技术网

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

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,而不删除文件夹 我需要检查文件夹是否为空,然后用另一个命令删

我试图清除一个公共目录,因此当一个项目超过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
同时返回文件和目录。假设有一个名为
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