这是我的第一篇文章&请记住,我的母语不是英语。
到目前为止 .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天以上的所有内容。
希望我能解释自己有点可以理解。
感谢阅读,希望你能帮助我!
答案 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