BATCH 创建新备份文件时删除最旧的备份文件

Fra*_*ère 1 backup cmd batch-file

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

无论如何,我偶然发现了这个:Batch Script to delete old folder in a given folder。我正在努力让它实现我的想法。

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

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"
Run Code Online (Sandbox Code Playgroud)

Den*_*ils 5

你可以使用这个:

@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
Run Code Online (Sandbox Code Playgroud)

我建议首先测试它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
Run Code Online (Sandbox Code Playgroud)

您可以通过删除该行来使此非循环(但仍然只有在超过 5 个时才删除) for /f %%A in ('dir "%source%" /a-d-s-h /b ^| find /v /c ""') do if %%A gtr %minFiles% goto :loop