2013-01-10 7 views
6

ich eine Batch-Datei geschrieben haben, das macht folgendes:Windows-Batch-Datei zu halten nur die letzten 30 Dateien

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= 

Ich spare die Dateien als %1 und Datum/Uhrzeit die Datei erstellt wurde:

SSS_20130110133304.ZIP 
SSS_20130110133336.ZIP 

Ich führe dies im Taskplaner, um jede Nacht zu laufen.

Ich möchte nicht zu viele Zip-Dateien im Verzeichnis haben, also möchte ich die letzten 30 Zip-Dateien, die es gibt, behalten.

Ich bin an diesem Punkt fest. Wie behalte ich die ZULETZTesten 30 Zip-Dateien, damit ich nicht mit einer Zip-Ladung von Zip-Dateien leide?

+0

+1 dafür 99% der Arbeit/präsentieren eine klare Frage. –

Antwort

10

Hiermit werden die ZIP-Dateien vom neuesten zum ältesten (nach Erstellungsdatum) aufgelistet, wobei die ersten 30 Dateien übersprungen werden.

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

einfach die echo-del ändern, wenn Sie die Dateien tatsächlich gelöscht werden soll. :)

+0

+1 für das Setzen des Befehls 'dir' in' '' '. –

+0

Ich habe Ihren Befehl auf meine 99 '.txt' Dateien (' for/f "überspringen = 30 delims ="% i in ('dir/ad/b/od/tc * .txt^2 ^> nul') tun del% i'), und es löschte 1-39 und 70-99 und ließ 40.txt - 69.txt. Die nächsten zwei Male habe ich es versucht, es hat gut funktioniert. Sehr komisch! –

+0

Vielen Dank für Ihre Hilfe! – ErocM

3

einfach auf die Frage konzentrieren - wie die 30 neuesten Dateien zu halten, und löschen Sie den Rest:

Sie können mit der richtigen Art eine dir > clean.lst tun, so dass die neuesten Dateien sind der Anfang der clean.lst. Dann können Sie den Befehl for verwenden, um die ersten 30 Zeilen in der Datei zu überspringen und die Dateien zu löschen, die nach der 30. Datei aufgelistet sind.

Betrachten Sie diesen Testfall:

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 

Jetzt 99 Textdateien in Sie den XYZ-Ordner haben.

Sie alle, aber die 30 letzten wie folgt entfernen:

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 

A dir zeigt nur die Textdateien 70.txt - 99.txt bleiben, haben der Rest entfernt.

Für Ihre Batch-Datei, ich denke, es ist etwas würde wie folgt aussehen:

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

Wie kann ich den% BKUPDIR% in den del aufnehmen? Ich habe Probleme, dass das richtig funktioniert. – ErocM

+0

bearbeitet meine Antwort mit einem Beispiel für Ihre Situation ... –

+0

Ihr Beispiel war großartig, ich bin gerade auf seine Antwort zuerst passiert. Sie haben beide gearbeitet, also habe ich dir +1 gegeben. Danke für die Hilfe! Dies gibt mir ein paar Ideen für Änderungen mit dem, was ich derzeit habe. – ErocM

Verwandte Themen