.Bat文件 - 如果至少3天的文件已经存在,则删除4天的备份

时间:2015-03-20 07:56:10

标签: windows batch-file cmd backup

这是我的第一篇文章&请记住,我的母语不是英语。

到目前为止

.bat文件:

C:

Cd\

forfiles /p Z:\SQL /s /m *.bak /d -4 /c "cmd /c del /q @path"

forfiles /p Z:\SQL /s /m *.trn /d -4 /c "cmd /c del /q @path"

我想要这个文件:

我希望它删除4天的备份&日志文件。这个.Bat文件适用于此 - 现在存在风险 - 如果由于某种原因备份/日志程序停止并且负责人生病了4天 - .bat文件将删除唯一有效的备份我有。

所以我要求:

是否有人知道切换.bat文件的方法,以便查找至少3天的文件 - 注意不仅仅是3个文件,而且必须是前3天连续。

示例:系统在星期一(1)进行备份,系统在星期四(2)崩溃。当调度程序在星期二(4)运行备份时,它将只删除星期一备份(这是我唯一有效的备份)因为它已有4天了。

我想要检查它的位置:过去3天我是否有其他.bak / .trn个文件是/否?

否=不要删除。

是=删除4天以上的所有内容。

希望我能解释自己有点可以理解。

感谢阅读,希望你能帮助我!

1 个答案:

答案 0 :(得分:0)

您可以提前计算它们以做出决定。这是一种方法。不幸的是,FORFILES不允许您轻松找到比4天前更新的文件,因此我们找到较旧的文件并从总数中减去。

循环浏览文件并将符合删除条件的文件添加到文本文件中:

forfiles /p Z:\SQL /s /m *.bak /d -4 /c "CMD /c ECHO @fname" > BAKfiles.tmp
forfiles /p Z:\SQL /s /m *.trn /d -4 /c "CMD /c ECHO @fname" > TRNfiles.tmp

接下来,使用FIND /c命令计算其中带引号的行,并使用FOR /F从冒号后的输出中解析总计。您需要为每种文件类型执行此操作,但我只显示一般文件类型。

FOR /F %%C IN ('dir *.BAK^| find "File(s)"') do SET BAKTOTAL=%%C
FOR /F %%C IN ('dir *.TRN^| find "File(s)"') do SET TRNTOTAL=%%C
FOR /F "tokens=2* delims=:" %%C IN ('cmd /c find /c """"  BAKfiles.tmp') DO SET BAKDEL=%%C
FOR /F "tokens=2* delims=:" %%C IN ('cmd /c find /c """"  TRNfiles.tmp') DO SET TRNDEL=%%C
SET /A BAKCOUNT=%BAKTOTAL% - %BAKDEL%
SET /A TRNCOUNT=%TRNTOTAL% - %TRNDEL%

然后使用IF评估计数,看看是否有足够的文件来满足您的阈值,并运行删除命令。

IF %BAKCOUNT% GEQ 3 IF %TRNCOUNT% GEQ 3 GOTO DELETEFILES
ECHO Not enough files were found.  Skipping deletion.
GOTO ENDING
:DELETEFILES
forfiles /p Z:\SQL /s /m *.bak /d -4 /c "cmd /c del /q @path"
forfiles /p Z:\SQL /s /m *.trn /d -4 /c "cmd /c del /q @path"
:ENDING
del /q BAKfiles.tmp
del /q TRNfiles.tmp