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

时间:2015-01-05 21:22:36

标签: windows batch-file command-line cmd

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

: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个最新的备份。

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

您可以使用DIR命令按修改日期以相反的顺序获取文件列表。然后,您只需告诉您的FOR循环跳过前10个(注意您的帖子代码显示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%