如何删除除少数

时间:2017-11-03 11:53:56

标签: batch-file for-loop delete-file

我想创建一个批处理文件,删除一个文件类型(即“.bak”),其中不同的日期范围位于同一专利文件夹中的不同子文件夹中,但我可以列出少数文件夹。

我设法创建一个FOR循环来查看某些目录(目录在变量中设置),使用以下脚本删除任何'* .bak'文件超过一定年龄:

SET "WeeklyBAKLocation=Folder20 Folder21 Folder25 Folder28"
SET WeeklyBAK=7
SET DailyBAK=3

FOR %%x IN (%WeeklyBAKLocation%) DO forfiles /p "%%x" /s /m *.bak /d -%WeeklyBAK% /c "cmd /c DEL @path /q"

<SECOND FOR LOOP below HERE>

以上工作在这些文件夹中删除超过7天的.bak文件,我的问题是我如何反转它并删除超过3天的每个其他目录中的'.bak'文件,而不删除保留的文件。第一次查询?

我尝试嵌套FOR和FORFILES,使用findstr / v忽略它们如下(但它会忽略该1循环的每个目录,然后删除它以用于下一个循环不会,所以最终它不会有工作并且效率很低?)

SET "WeeklyBAKLocation=Folder20 Folder21 Folder25 Folder28"
SET WeeklyBAK=7
SET DailyBAK=3

<First FOR LOOP above HERE>

FOR %%x IN (%WeeklyBAKLocation%) DO FOR /F "delims=*" %%G IN ('dir /b /s "%~dp0" ^| findstr /v "\%%x"') DO forfiles /p "%%G" /s /m *.bak /d -%DailyBAK% /c "cmd /c ECHO @path /q"

基本上,我可以一次性忽略某些目录,找到.bak文件,只删除3天前的.bak文件。

非常感谢提前。

1 个答案:

答案 0 :(得分:0)

FOR /F "delims=*" %%G IN (
 'dir /b /s /AD "%~dp0" ^| findstr /v "\%%x"') DO (
 set "zapme=Y"
 FOR %%x IN (%WeeklyBAKLocation%) DO if /i "%%x"=="%%G" set "zapme="
 if defined zapme forfiles /p "%%G" /s /m *.bak /d -%DailyBAK% /c "cmd /c ECHO @path /q"
)

以基本形式阅读目录列表(注意/ad),对于每个目录,将zapme设置为某些,然后检查目录是否不是处理并将zapme设置为 nothing ,如果它是其中一个目录。然后可以测试zapme标志是否已设置。如果已设置,请继续处理目录。

FOR /F "delims=*" %%G IN (
 'dir /b /AD "%sourcedir%"') DO (
  set "zapme=Y"
  FOR %%x IN (%WeeklyBAKLocation%) DO if /i "%%x"=="%%G" set "zapme="
  if defined zapme ECHO forfiles /p "%sourcedir%\%%G" /s /m *.bak /d -%DailyBAK% /c "cmd /c ECHO @path /q"
)

...每当我没有实际测试时就会发生......