Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows .Bat文件-如果至少已有3天的文件存在,则删除4天的备份_Windows_Batch File_Cmd_Backup - Fatal编程技术网

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

Windows .Bat文件-如果至少已有3天的文件存在,则删除4天的备份,windows,batch-file,cmd,backup,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
到目前为止的文件:

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天的所有内容

希望我的解释能理解一些


谢谢你的阅读,希望你能帮助我

你可以提前数一数,做出决定。这里有一个方法。不幸的是,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

我想你可以把这个问题减少到最多10行。