Batch file 创建新备份文件时批量删除最旧的备份文件

Batch file 创建新备份文件时批量删除最旧的备份文件,batch-file,cmd,backup,Batch File,Cmd,Backup,我有一个问题,关于在文件夹获得X个相同扩展名的文件后删除最旧的文件,在这种情况下,所有文件共享扩展名*。bak,它们是我为firefox RES创建的小文件,它们在标题上有印记,创建日期和时间,这就是我能做的 不管怎样,我偶然发现了这个:。我正努力让它实现我的想法 问题是,我希望批处理在使用这行简单的代码创建一个新文件后,只需检查哪个文件最旧 copy /y store.json "%DROPBOX%\RES BACKUPS\store.json %date:~-4,4%-%date:~-7,2

我有一个问题,关于在文件夹获得X个相同扩展名的文件后删除最旧的文件,在这种情况下,所有文件共享扩展名
*。bak
,它们是我为firefox RES创建的小文件,它们在标题上有印记,创建日期和时间,这就是我能做的

不管怎样,我偶然发现了这个:。我正努力让它实现我的想法

问题是,我希望批处理在使用这行简单的代码创建一个新文件后,只需检查哪个文件最旧

copy /y store.json "%DROPBOX%\RES BACKUPS\store.json %date:~-4,4%-%date:~-7,2%-%date:~-10,2%_%time:~0,2%hs-%time:~3,2%min-%time:~6,2%s.bak"
您可以使用以下选项:

@echo off
for /f "delims=" %%a in ('dir /b /a-d /t:w /o:d "%DROPBOX%\RES BACKUPS\*.bak"') do (
    del "%%a"
    goto :breakLoop
    )
:breakLoop
我建议首先使用
echo del“%%a”
测试它,以确保它删除了正确的文件

这是通过获取dir命令的输出来实现的,该命令以裸格式显示所有文件(仅文件名,不包括大小等),首先按最旧的文件排序。然后删除找到的第一个文件,并中断循环

当文件超过特定数量时,保持删除的版本:

@echo off
set "source=%DROPBOX%\RES BACKUPS\*.bak"
set "minFiles=5"
for /f %%A in ('dir "%source%" /a-d-s-h /b ^| find /v /c ""') do if %%A leq %minFiles% goto :eof
:loop
for /f "delims=" %%a in ('dir /b /a-d /t:w /o:d "%source%"') do (
    del "%%a"
    goto :breakLoop
    )
:breakLoop
for /f %%A in ('dir "%source%" /a-d-s-h /b ^| find /v /c ""') do if %%A gtr %minFiles% goto :loop
pause
您可以通过删除('dir”%source%/A-d-s-h/b^ | find/v/c“')中/f%%A的行
)来实现此非循环(但仍仅当有超过5行时才删除)。如果%%A gtr%minFiles%goto:loop,您可以使用以下方法:

@echo off
for /f "delims=" %%a in ('dir /b /a-d /t:w /o:d "%DROPBOX%\RES BACKUPS\*.bak"') do (
    del "%%a"
    goto :breakLoop
    )
:breakLoop
我建议首先使用
echo del“%%a”
测试它,以确保它删除了正确的文件

这是通过获取dir命令的输出来实现的,该命令以裸格式显示所有文件(仅文件名,不包括大小等),首先按最旧的文件排序。然后删除找到的第一个文件,并中断循环

当文件超过特定数量时,保持删除的版本:

@echo off
set "source=%DROPBOX%\RES BACKUPS\*.bak"
set "minFiles=5"
for /f %%A in ('dir "%source%" /a-d-s-h /b ^| find /v /c ""') do if %%A leq %minFiles% goto :eof
:loop
for /f "delims=" %%a in ('dir /b /a-d /t:w /o:d "%source%"') do (
    del "%%a"
    goto :breakLoop
    )
:breakLoop
for /f %%A in ('dir "%source%" /a-d-s-h /b ^| find /v /c ""') do if %%A gtr %minFiles% goto :loop
pause

如果%%A gtr%minFiles%goto:loop

您好,您可以通过删除('dir“%source%”/A-d-s-h/b^中/f%%A的行
)来实现此非循环(但仍仅当有超过5行时才删除)!谢谢你的回答,要对代码的功能做一点解释实在太过分了?或者一个我可以阅读的页面,这样我可以同时学习。我会测试一下,看看会发生什么。@FranciscoLaferrière补充了一个解释——“Dennis van Gils”啊,我明白了,现在我所要做的就是多做几次备份,以达到我实际备份的“期望数量”,因为如果我理解正确,就没有“如果”语句来告诉我是否有比需要的更多的文件。我说得对吗?为了简化逻辑,我将
:loop
移到了
的第一个
上方,将
转到:breakLopp
改为
转到:loop
,删除了
:breakLoop
,并将
的最后一个
改为
转到:loop
。这样做的逻辑是:如果有5个以上的文件,请删除一个并重复。嗨!谢谢你的回答,要对代码的功能做一点解释实在太过分了?或者一个我可以阅读的页面,这样我可以同时学习。我会测试一下,看看会发生什么。@FranciscoLaferrière补充了一个解释——“Dennis van Gils”啊,我明白了,现在我所要做的就是多做几次备份,以达到我实际备份的“期望数量”,因为如果我理解正确,就没有“如果”语句来告诉我是否有比需要的更多的文件。我说得对吗?为了简化逻辑,我将
:loop
移到了
的第一个
上方,将
转到:breakLopp
改为
转到:loop
,删除了
:breakLoop
,并将
的最后一个
改为
转到:loop
。这样做的逻辑是:如果有5个以上的文件,请删除一个并重复。