批处理文件删除除最新的 10 个文件之外的所有文件

Ero*_*ocM 3 windows command-line cmd batch-file

我在批处理文件中有以下内容:

:REMOLDFILES
ECHO Removing files older than 14 days. >>%LOGFILE%
cd /d %BKUPDIR%
FOR /f "skip=14 delims=" %%A IN ('DIR /a:-d /b /o:-d /t:c %1*.zip ^2^>nul') DO IF EXIST "%%~fA" ECHO "%%~fA" >>%LOGFILE%
FOR /f "skip=14 delims=" %%A IN ('DIR /a:-d /b /o:-d /t:c %1*.zip ^2^>nul') DO IF EXIST "%%~fA" DEL "%%~fA" >>%LOGFILE%
FOR /f "skip=14 delims=" %%A IN ('DIR /a:-d /b /o:-d /t:c %1*.log ^2^>nul') DO IF EXIST "%%~fA" ECHO "%%~fA" >>%LOGFILE%
FOR /f "skip=14 delims=" %%A IN ('DIR /a:-d /b /o:-d /t:c %1*.log ^2^>nul') DO IF EXIST "%%~fA" DEL "%%~fA" >>%LOGFILE%
IF [%3]==[Y] GOTO SECONDBACKUPDIR
IF [%3]==[y] GOTO SECONDBACKUPDIR
GOTO END
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是备份有几个星期没有运行,最终删除了我所有的备份,因为它们已经超过 2 周了。

我需要的是保留最近的 10 个最新备份。

任何人都知道我会怎么做?我没有写过一次,因为我对批处理文件不太熟悉。

l'L*_*L'l 5

FOR /F SKIP在按最后修改日期排序后,您可以使用忽略最近修改的最后 10 个条目:

for /f "skip=10 eol=: delims=" %%F in ('dir /b /o-d *.zip') do @del "%%F"
Run Code Online (Sandbox Code Playgroud)

  • 错误的!错误的!错误的!此代码与原始发布的代码 ** 完全相同,除了** 它将删除除最后 **10** zip 文件之外的所有文件,而原始代码允许保留 **14**。否则,它实际上与原始代码*完全*相同,除了它只处理 `*.zip` 文件并且不满足存在名为 `*.zip* 的目录的可能性很小的情况。 (2认同)
  • 原始代码保留了最后一个 **14**,抱怨说它“最终删除了我所有的备份,因为它们已经超过 2 周了。” 原文中的**14** * 不是*天数,而是文件数。如果原始代码因为“备份没有运行几个星期”而删除了所需的数据,那么需要设计一些其他方法来确定备份已经运行,因为**存在 .zip 或 .log**显然 **not** 表示已经运行了备份。 (2认同)
  • 很棒的单线。非常感谢,你为我节省了很多时间! (2认同)