批处理文件删除除最新的 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"
我在批处理文件中有以下内容:
: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"