如何删除* .bak文件,recursion地取决于文件path中的目录比特定的date更早?

我正在为Windows 7编写一个batch file

我目前有一个代码,从我们的网站pipe理文件夹中的主文件夹中删除旧的备份。 这是代码:

for /d %%A in ("Y:\*.*") do del /s /q /f "%%A\masters\*.bak" 

不过,我需要编码,只删除大于3年的事情,这将是这个代码:

 forfiles /P "Y:\" /S /D -1096 /M *.bak /C "cmd /C del @path" 

不过,我需要顶级代码中的内容,以便可以从我们的173个站点pipe理文件夹中存在的masters文件夹中删除所有* .bak文件。 我把我的头发搞砸了。 我不能从我们的其他文件夹删除* .bak文件。

我已经尝试组合代码,但在batch file下面的命令行不按预期方式工作:

 forfiles /S /D -1096 /M *.bak /C "cmd /C for /d %%A in ("Y:\*.*") do del /s /q /f "%%A\masters\*.bak" 

如果文件path中的第二个目录是masters目录,并且保持所有其他* .bak文件更新或者目录中文件path中第二个目录不是masters目录,那么如何在目录树中的任何位置删除大于3年的所有* .bak文件?

Solutions Collecting From Web of "如何删除* .bak文件,recursion地取决于文件path中的目录比特定的date更早?"

使用以下命令首先创建一个批处理文件C:\Temp\DeleteBackup.bat

 @echo off set "BackupFileName=%~1" if not "%BackupFileName:\masters\=%" == "%BackupFileName%" ECHO del "%BackupFileName%" 

此批处理代码通过从字符串比较的左参数中移除不区分大小写的字符串来检查具有完整路径和文件扩展名的文件名是否包含任何\masters\

如果由于包含\masters\路径中的剩余字符串不等于未修改的文件名字符串,则IF条件为真,如果不存在命令ECHO而导致只显示DEL命令行,则备份文件将被删除。

例如备份文件的完整列表是:

 Y:\masters\Level2\Level3\Level4\Level5\Test1.bak Y:\Folder2\masters\Level3\Test2.bak Y:\Folder3\Level2\masters\Level4\Test3.bak Y:\Folder4\Level2\Level3\Level4\Level5\Test4.bak Y:\Folder5\Level2\Test5.bak Y:\Folder6\Level2\Level3\Level4\Level5\Level6\Test6.bak Y:\Folder7\masters\Test7.bak 

被删除的文件将是:

 Y:\masters\Level2\Level3\Level4\Level5\Test1.bak Y:\Folder2\masters\Level3\Test2.bak Y:\Folder3\Level2\masters\Level4\Test3.bak Y:\Folder7\masters\Test7.bak 

剩下的文件将是:

 Y:\Folder4\Level2\Level3\Level4\Level5\Test4.bak Y:\Folder5\Level2\Test5.bak Y:\Folder6\Level2\Level3\Level4\Level5\Level6\Test6.bak 

然后在你的批处理文件中使用:

 forfiles /P "Y:\" /S /D -1096 /M *.bak /C "C:\Temp\DeleteBackup.bat @PATH" 

当然可以修改DeleteBackup.bat来检查第二个目录层级中的目录是否是masters目录。

 @echo off for /F "tokens=3 delims=\" %%I in ("%~1") do if /I "%%I" == "masters" ECHO del "%~1" 

这段代码将从文件上面的完整列表中删除:

 Y:\Folder2\masters\Level3\Test2.bak Y:\Folder7\masters\Test7.bak 

剩下的文件将是:

 Y:\masters\Level2\Level3\Level4\Level5\Test1.bak Y:\Folder3\Level2\masters\Level4\Test3.bak Y:\Folder4\Level2\Level3\Level4\Level5\Test4.bak Y:\Folder5\Level2\Test5.bak Y:\Folder6\Level2\Level3\Level4\Level5\Level6\Test6.bak 

Robert Chizmadia Jr.在一个已经删除的评论中问道:

有没有可能使用GOTO而不是调用FORFILES命令行上的另一个批处理文件?

关于这个附加问题的答案是:

FORFILES不是像FOR一样的cmd.exe的内部命令。 它是存储在目录%SystemRoot%\System32一个控制台应用程序,如果使用的Windows版本已经预安装的话。

FORFILES选项/C之后执行的命令必须是可执行文件或脚本。 这就是为什么当像Windows那样的Windows命令解释程序cmd.exe的内部命令应该由FORFILES执行时总是使用cmd /C的原因,因此真正完整的命令将是%SystemRoot%\System32\cmd.exe /C

所以在FORFILES命令中不可能使用像GOTO 这样的命令,因为没有名字为GOTO的可执行文件或脚本。

另外FOR循环中的GOTO退出循环,因此解释批处理文件的命令行在批处理文件中的另一个位置上继续。

但是,可以使用与用于运行FORFILES命令的文件路径评估和备份文件删除相同的批处理文件。

示例1,批处理文件不预期任何参数用于默认操作:

 @echo off if not "%~1" == "" ( for /F "tokens=3 delims=\" %%I in ("%~1") do if /I "%%I" == "masters" ECHO del "%~1" goto :EOF ) %SystemRoot%\System32\forfiles.exe /P "Y:\" /S /D -1096 /M *.bak /C "%~f0 @PATH" 

如果这个批处理文件是用一个参数执行的,它会运行FOR循环来检查文件路径中的第二个目录是否是masters文件,并在删除ECHO之后删除这个文件。 否则,在没有任何参数的情况下启动批处理文件时,批处理文件运行FORFILES可执行文件。

示例2带有批处理文件,默认操作需要一个或多个参数:

 @echo off if "%~1" == "#Delete:Backup#" ( for /F "tokens=3 delims=\" %%I in ("%~2") do if /I "%%I" == "masters" ECHO del "%~2" goto :EOF ) rem Other commands processing the parameters. %SystemRoot%\System32\forfiles.exe /P "Y:\" /S /D -1096 /M *.bak /C "%~f0 #Delete:Backup# @PATH" rem More commands executed after the deletion of the backup files. 

这与示例1几乎相同,区别在于,如果在运行批处理文件时使用的第一个参数区分大小写字符串#Delete:Backup# ,则批处理文件将作为第二个参数指定具有完整路径的备份文件的名称如果文件路径中的第二个目录是masters文件,则删除。

就像在所有的批处理代码示例中一样,在本代码示例中也必须删除del命令之前的命令ECHO才能真正执行删除备份文件。


为了理解使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • echo /?
  • for /?
  • forfiles /?
  • goto /?
  • if /?
  • set /?