2013-01-10 67 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

相關問題