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

batch file remove all but the newest 10 files

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

: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

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

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

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

您可以使用 DIR 命令按修改日期倒序获得文件列表。然后你只需告诉你的 FOR 循环跳过前 10 个( 注意 你的 post 代码显示 14,但你要求 10)条目,所以处理的内容都会被删除。

REM Update to 14 if needed.
SET Keep=10
FOR /F "usebackq tokens=* skip=%Keep% delims=" %%A IN (`DIR *.zip /B /O:-D /A:-D`) DO DEL "%%A">>%LOGFILE%

由于您不熟悉批处理,您可以通过将 DEL 替换为 ECHO.

来测试此命令(以查看将删除的内容而不是实际删除的内容)

编辑

既然你也在处理日志文件,为什么不在同一个循环中删除它们呢?

REM Update to 14 if needed.
SET Keep=10
FOR /F "usebackq tokens=* skip=%Keep% delims=" %%A IN (`DIR *.zip /B /O:-D /A:-D`) DO (
    ECHO Processing: %%~nA
    REM Delete ZIP file.
    DEL "%%A"
    REM Delete LOG file.
    DEL "%%~nA.log"
)>>%LOGFILE%

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

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