2013-01-10 66 views
6

我写了一个批处理文件,执行以下操作:Windows批处理文件只保留最后30个文件

REM @ECHO OFF 
rem %1 = coid 
rem %2 = rpg location with ending/

rem get the path of this cmd script 
SET SUBDIR=%~dp0 

SET BKUPDIR=%SUBDIR%BACKUPS\ 
SET LOGFILE=%BKUPDIR%backup.log 

ECHO ************************************************* >>%LOGFILE% 
ECHO STARTING BACKUP FOR %1 AT %2 >>%LOGFILE% 

FOR /f "skip=1" %%x in ('wmic os get localdatetime') DO IF NOT defined mydate SET mydate=%%x 
SET filedate=%mydate:~0,14% 
SET fullname=%BKUPDIR%%1_%FILEDATE%.ZIP 

ECHO BKUPDIR: %BKUPDIR% >>%LOGFILE% 
ECHO mydate: %mydate% >>%LOGFILE% 
ECHO filedate: %filedate% >>%LOGFILE% 
ECHO fullname: %fullname% >>%LOGFILE% 
ECHO SUBDIR: %SUBDIR% >>%LOGFILE% 

rem lets make sure the backup directory exists before starting 
IF NOT EXIST %BKUPDIR% MD %BKUPDIR% >>%LOGFILE% 

%SUBDIR%7z a -tzip %fullname% %2%1*.d 
IF ERRORLEVEL 255 ECHO user_stopped_the_process >>%LOGFILE% 
IF ERRORLEVEL 8 ECHO not_enough_memory >>%LOGFILE% 
IF ERRORLEVEL 7 ECHO command_line_error >>%LOGFILE% 
IF ERRORLEVEL 2 ECHO fatal_error >>%LOGFILE% 
IF ERRORLEVEL 1 ECHO ok_warnings >>%LOGFILE% 

IF ERRORLEVEL 0 GOTO END 
IF EXIST %fullname% DEL %fullname% 

:END 
ECHO FINISHING BACKUP FOR %1 >>%LOGFILE% 
ECHO ************************************************* >>%LOGFILE% 
set mydate= 

我保存文件为%1和日期/时间文件的创建:

SSS_20130110133304.ZIP 
SSS_20130110133336.ZIP 

我在任务计划程序中运行这个任务,每晚运行一次。

我想避免在目录中有太多的zip文件,所以我想保留最后30个存在的zip文件。

我被困在这一点。我如何保留最新的30个压缩文件,这样我就不会因为压缩文件而导致压缩文件加载了?

+0

+1做的工作99%/呈现一个清晰的问题。 –

回答

10

这将从最新到最旧(按创建日期)列出.zip文件,跳过前30个文件。

for /f "skip=30 delims=" %%A in ('dir /a:-d /b /o:-d /t:c *.zip ^2^>nul') do if exist "%%~fA" echo "%%~fA" 

当你想真正删除的文件只要改变echodel:)

+0

用于将'dir'命令放入'()'中。 –

+0

我在99'.txt'文件('for/f“skip = 30 delims =”%i in('dir/ad/b/od/tc * .txt^2 ^> nul')上运行了你的命令del%i'),并删除了1-39和70-99,剩下40.txt - 69.txt。接下来的两次我尝试了它,它工作得很好。很奇怪! –

+0

谢谢你的帮助! – ErocM

3

只需专注于这个问题 - 如何保持最近30个文件,并删除其余:

你可以做一个dir > clean.lst与适当的排序,从而使最近的文件是在clean.lst的开头。然后,您可以使用for命令跳过文件中的前30行,并删除第30个文件之后列出的文件。

考虑这个测试用例:

C:>md xyz 
C:>cd xyz 
c:\xyz>copy con genfiles.bat 
@echo off 
set _i=1 
:loop 
if %_i%==100 goto :EOF 
echo.>%_i%.txt 
set /a _i+=1 
goto loop 
^Z 
     1 file(s) copied. 

c:\xyz>genfiles 
c:\xyz>del genfiles.bat 

现在,你必须在XYZ文件夹中的99个文本文件。

您可以删除所有,但最近30次这样的:

C:\xyz>dir /b /o-d *.txt > clean.lst 
C:\xyz>for /f "skip=30 delims=" %i in (clean.lst) do del "%i" 
C:\xyz>del clean.lst 

一个dir仅显示文本文件70.txt - 99.txt依然存在,其余的都被删除。

为了您的批处理文件,我认为这将是这个样子:

cd /d %BKUPDIR% 
dir /b /o-d *.zip > clean.lst 
for /f "skip=30 delims=" %%i in (clean.lst) do del "%%i" 
del clean.lst 
+1

如何将%BKUPDIR%与del?我遇到问题需要正常工作。 – ErocM

+0

编辑我的答案,以你的情况为例... –

+0

你的榜样很棒,我刚刚在他的回答中发生了。他们都工作,所以我给你+1。感谢您的帮助!这给了我几个想法,以改变我目前的状况。 – ErocM

相关问题