2017-09-04 117 views
0

我有一个脚本会从嵌套文件结构中删除所有超过31天的文件。使用批处理文件删除子文件夹中的所有空文件夹?

在某些时候,它会留下空文件夹,我正在寻找一种方法来删除它们,最好保留比31天更新的文件夹。鉴于rd FolderName不会删除文件夹,如果它不是空的,我可以用它来删除文件夹。问题是,如果我这样做,它不会删除所有空文件夹,只有树中最深的文件夹。如果我可以将文件的名单反转给我,它就会起作用。如果这不可能,还有另一种方法吗?

注意:rd/s不会删除嵌套的文件夹,但也会删除其文件。如果文件夹不为空,我不想删除该文件夹。

这里是我的脚本:

@echo off 
cd /d "C:\MyPath" 

:: remove files that are older than 31 days (retention period) 
forfiles /s /d -31 /c "cmd /c if @isdir==FALSE del @relpath") 

:: attempt to remove folders (will fail if the folder is not empty.) 
forfiles /s /d -31 /c "cmd /c if @isdir==TRUE rd @relpath" 

以上脚本将只删除最深的文件夹。我想我可以连续执行8次文件,但这是对资源的严重浪费。

+0

'SORT'有'/ r'选项... – Magoo

+0

@Magoo有趣。现在我必须弄清楚如何使用我的脚本工作。 forfiles | sort/r的作品,但我如何执行一个命令呢?如果你有答案,随时给我写一个答案,我会很乐意给你一票和检查。 :) – LPChip

+0

'for/f“delims =”%% a in('dir/s/b/ad“C:\ mypath”^ | sort/r')do echo %% a'会产生一个基本的目录列表目录的子目录,然后对其进行反向排序,以便任何目录名显示*在列表中的子目录之后。 – Magoo

回答

0

在@Magoo的帮助下,我指出可以使用sort/r来反转列表,我设法找到了一个解决方案。

使用的代码如下:

@echo off 
cd /d "C:\MyPath" 

:: remove files that are older than 31 days (retention period) 
forfiles /s /d -31 /c "cmd /c if @isdir==FALSE del @relpath") 

:: attempt to remove folders (will fail if the folder is not empty.) 
for /f %%i IN ('forfiles /s /d -31 /c "cmd /c if @isdir==TRUE echo @relpath" ^|sort /r') DO rd %%i 
+0

你的答案不符合你自己的问题标准,它只会删除在过去30天内没有被修改的目录,并且没有内容。您想删除过去30天内未修改过的所有文件,然后删除所有没有内容的年龄的所有目录。 – Compo

+0

@compo我的答案中添加的行是我脚本的最后一行。我可以在我的答案中复制脚本的文本,但似乎过度。但如果它让你开心,我会编辑脚本来添加它。 – LPChip

1

为了除去没有内容的目录下面,如已经@Magoo暗示将是更好的,比你自己的答案要快得多:

FOR /F "DELIMS=|" %%A IN ('DIR/B/S/AD-S-L^|SORT/R') DO RD "%%A" 2>NUL 
+0

你能解释为什么它更快吗?此外,它不会排除空的但比31天更新的文件夹。 – LPChip

+0

我刚刚注意到我的问题没有说明如果可能,我想在31天内保留空文件夹。我会编辑它。但如果表现非常不同,我可能会选择忽略这31天。 – LPChip

+0

你的问题没有规定你希望在树中保留空目录长达31天!请相应地编辑(https://stackoverflow.com/posts/46033592/edit)您的问题,然后接受您自己的答案作为解决方案。 – Compo

相关问题