2016-09-07 88 views
2

我试图清除一个公共目录,所以当一个项目超过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

使用[RD](http://ss64.com/nt/rd.html)删除文件夹。它不会删除一个非emty文件夹,除非你给它一个'/ s/q' – Stephan

+0

你想检查文件夹是否30天?如果是这样,则使用@ isdir变量仅检查目录,然后删除该目录。 – Squashman

回答

2

您所使用的命令行是相当危险的(我只是在这里复制它,并重新排序的开关):

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,其中全部为文件,即使那些不符合搜索条件(请注意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 
相关问题