Frage ist gelöstIm Backupordner mittels cmd alle Backups, außer den letzen drei löschen
12.01.2010
12:45:29 Uhr3728 Aufrufe
10 Antworten
12:45:29 Uhr
10 Antworten
Noch nicht bewertet
Bisher werden Daten unregelmäßig in einen Ordner "name_YY-MM-TT_h-i" gesichert (mittels 7zip oder robocopy).
Nun sollen ab und an die alten Backups gelöscht werden, aber nicht nach Zeit (alles was älter als 7 Tage ist weg), sondern es sollen die aktuellsten X (z.B. 3) Backupordner erhalten bleiben.
Nun sollen ab und an die alten Backups gelöscht werden, aber nicht nach Zeit (alles was älter als 7 Tage ist weg), sondern es sollen die aktuellsten X (z.B. 3) Backupordner erhalten bleiben.
Hallo zusammen!
Bisher werden Daten unregelmäßig in einen Ordner "name_YY-MM-TT_h-i" gesichert (mittels 7zip oder robocopy).
Nun sollen ab und an die alten Backups gelöscht werden, aber nicht nach Zeit (alles was älter als 7 Tage ist weg), sondern es sollen die aktuellsten X (z.B. 3) Backupordner erhalten bleiben.
Bisher wird mit 7za.exe, GetAllDateTimeInfos.cmd und dieser cmd gesichert :
Hat jemand bitte einen Vorschlag....
Viele Grüße
user09
Bisher werden Daten unregelmäßig in einen Ordner "name_YY-MM-TT_h-i" gesichert (mittels 7zip oder robocopy).
Nun sollen ab und an die alten Backups gelöscht werden, aber nicht nach Zeit (alles was älter als 7 Tage ist weg), sondern es sollen die aktuellsten X (z.B. 3) Backupordner erhalten bleiben.
Bisher wird mit 7za.exe, GetAllDateTimeInfos.cmd und dieser cmd gesichert :
01.
@echo off 02.
:start 03.
CLS 04.
setlocal 05.
06.
:: DateTime von Biber version 0.08 07.
set DateTime= 08.
Call GetAllDateTimeInfos /s 09.
set "DateTime=%JJ%-%MM%-%TT%__%hh%-%min%" 10.
Call GetAllDateTimeInfos /u 11.
12.
If /i [%1]==[/?] goto Syntax 13.
14.
:: zum Testen die verzeichnisstruktur kopieren 15.
:: xcopy e:\daten e:\daten_test /t /e 16.
17.
: * ZIEL * 18.
19.
set "Bak_Ordner1=e:\daten_bak\Daten_7z" 20.
md %Bak_Ordner1%\%DateTime% 21.
set "Bak_Ordner2=e:\daten_bak\%DateTime%" 22.
set "Destination=%Bak_Ordner2%\daten.7z" 23.
24.
: * QUELLE * 25.
set "Source=e:\daten\*" 26.
27.
: * INCLUDE * 28.
set "Include=@include.lst" 29.
:: INHALT include.lst 30.
rem #kommentar 31.
rem E:\Daten1\ 32.
rem E:\Daten2\ 33.
34.
: * EXCLUDE * 35.
rem list files: UTF-8 is default encoding | -scs switch 36.
set "Exclude=@exclude.lst" 37.
::set "Exclude=@\path\sub\exclude.lst" 38.
:: INHALT exclude.lst 39.
rem #kommentar 40.
rem temp\ 41.
rem #private Ordner, die "privat" im Namen haben, ausschliessen 42.
rem *Privat\* 43.
44.
REM * GROESSE DER ZIPs * 45.
set "Groesse=1024" rem ... in Megabyte 46.
47.
48.
:Suche1 49.
color 0A 50.
echo. 51.
echo Daten in Paketen zu jeweils %Groesse% MB packen: 52.
echo ............................................ && echo. 53.
54.
7za a -t7z -bd -r "-ir%Include%" "-xr%Exclude%" -scsWIN -v%Groesse%m %Destination% %Source% 55.
rem a ... add 56.
rem -t7z | -tzip ... Format 57.
rem -bd ... prozentuale Fortschrittsanzeige aus (schneller?) 58.
rem -r ... Verzeichnisse rekursiv abarbeiten 59.
rem -scs{UTF-8 | WIN | DOS} ...Sets charset for list files 60.
rem -ai[r[-|0]]{@listfile|!wildcard}: Include archives 61.
rem -ax[r[-|0]]{@listfile|!wildcard}: eXclude archives 62.
63.
: * LIST archiv * 64.
rem bei multivolume archiven immer die erste datei mit 7z aufrufen 65.
:: 7za l E:\Daten_Bak\Daten_7z\2010-01-11__16-51\daten.7z.001 66.
67.
: * EXTRACT * 68.
:: 7za x E:\Daten_Bak\Daten_7z\2010-01-11__16-51\daten.7z.001 -oe:\Ordner1 *.log -r 69.
rem alle log-daten nach e:\Ordner1 entpacken 70.
71.
:DELETE 72.
call del 73.
74.
endlocal 75.
:: echo. && pause && echo. && echo. 76.
77.
78.
:EOF 79.
pause>nul 80.
81.
::DELETE 82.
:DEL 83.
::set "Del_Ordner=e:\daten_bak\Daten_7z" 84.
set "Del_Ordner=%Bak_Ordner1%" 85.
if not exist e:\Temp_bak md e:\Temp_bak 86.
87.
robocopy %Del_Ordner%\ e:\Temp_bak\ /minage:7 /XJ 88.
:: /MAXAGE:n :: MAXimum file AGE - exclude files older than n days/date. 89.
:: /MINAGE:n :: MINimum file AGE - exclude files newer than n days/date. 90.
91.
rem ---> 92.
rem dauert viel zulange und frisst ressourcen 93.
rem wenn in den den letzen 7 tagen kein backup lief, dann ist alles weg :-( 94.
95.
rd "e:\Temp_bak\" /S /Q 96.
rem löschen mit remove directory ... 97.
:: für Dateien: 98.
:: del e:\Temp_bak\ 99.
:: del "Zielpfad\*.* /S /F 100.
:: /S == Unterverzeichnisse 101.
:: /F == Löschen erzwingenHat jemand bitte einen Vorschlag....
Viele Grüße
user09
TheDarkLord schreibt am 12.01.2010 um 13:45:04 Uhr
Hallo 
Nur so als kleiner Gedankenblitz:
Lies doch mit "dir /b /O:D > %temp%\dirlist.txt" den Inhalt des Backupverzeichnisses in eine Datei, das aktuellste Datum am Ende.
Dann ließ die letzten 3 Zeilen (= Backupname) in jeweils eine Variable ein und schieße diese Dateien dann vom Löschen aus.
Vielleicht hilft Dir der Denkanstoß weiter...
Gruß Dark
Nur so als kleiner Gedankenblitz:
Lies doch mit "dir /b /O:D > %temp%\dirlist.txt" den Inhalt des Backupverzeichnisses in eine Datei, das aktuellste Datum am Ende.
Dann ließ die letzten 3 Zeilen (= Backupname) in jeweils eine Variable ein und schieße diese Dateien dann vom Löschen aus.
Vielleicht hilft Dir der Denkanstoß weiter...
Gruß Dark
user2009 schreibt am 12.01.2010 um 14:13:57 Uhr
Hallo Dark,
danke für Deine Antwort.
Für obige cmd habe ich ewig gebraucht.
Habe jetzt keinen Plan für Deinen Vorschlag:
Wenn jemand diesen Threat liest und etwas ähnliches schon gemacht hat oder sonst helfen kann, dann bitte antworten.
danke für Deine Antwort.
Für obige cmd habe ich ewig gebraucht.
Habe jetzt keinen Plan für Deinen Vorschlag:
Dann ließ die letzten 3 Zeilen (= Backupname) in jeweils eine Variable ein und schließe diese Dateien dann vom Löschen aus.
Wenn jemand diesen Threat liest und etwas ähnliches schon gemacht hat oder sonst helfen kann, dann bitte antworten.
TheDarkLord schreibt am 12.01.2010 um 14:52:49 Uhr
Hallo 
Ja kein Problem, ich hab gerade ein wenig Zeit, ich schau mir das mal an und poste Dir dann nen passenden Code-Schnipsel.
Bis bald!
Ja kein Problem, ich hab gerade ein wenig Zeit, ich schau mir das mal an und poste Dir dann nen passenden Code-Schnipsel.
Bis bald!
Biber schreibt am 12.01.2010 um 15:15:51 Uhr
Moin user2009,
mit dem Abfeuern der Zeile
...vom CMD-Pompt aus würden alle Verzeichnisse unterhalb von D:\temp ausgenommen die 7 jüngsten gelöscht (bzw das Löschen mit "ECHO rd" angezeigt).
Das sollte bei dir auch "aus dem Handgelenk" gehen, wenn du die Zeile einmailg verstanden hast.
Hint: Hilfe gibt es auch mit DIR/? und /FOR/? und /RD/?
Grüße
Biber
mit dem Abfeuern der Zeile
01.
FOR /F "skip=7 delims=" %i in ('Dir /ad /b /o-d d:\temp') do @echo rd "%i" /s /qDas sollte bei dir auch "aus dem Handgelenk" gehen, wenn du die Zeile einmailg verstanden hast.
Hint: Hilfe gibt es auch mit DIR/? und /FOR/? und /RD/?
Grüße
Biber
TheDarkLord schreibt am 12.01.2010 um 15:53:40 Uhr
Du warst schneller 
Er sagte, dass er nicht mit dem Datum arbeiten will, falls längere Zeit kein Backup gemacht wurde, aber das ist ja bei Dir kein Problem.
Du löscht ja nicht alles was älter ist als X sondern alles ausser die letzten X Backups.
Aber handelt es sich nicht um Backup-Dateien? Du schreibst was von UnterORDNERN ?!
Ich hab mal wieder viel zu kompliziert gedacht und alles sehr umständlich geschrieben, funktioniert aber auch
Gruß Dark
Er sagte, dass er nicht mit dem Datum arbeiten will, falls längere Zeit kein Backup gemacht wurde, aber das ist ja bei Dir kein Problem.
Du löscht ja nicht alles was älter ist als X sondern alles ausser die letzten X Backups.
Aber handelt es sich nicht um Backup-Dateien? Du schreibst was von UnterORDNERN ?!
Ich hab mal wieder viel zu kompliziert gedacht und alles sehr umständlich geschrieben, funktioniert aber auch
01.
:: Das Script darf natürlich NICHT in dem Ordner liegen, wo die zu löschenden Backups sind, sonst wirds ja mit gelöscht :) 02.
03.
set "PFAD=Ordner-indem-die-zu-löschenden-backups-drin-sind" 04.
05.
:: Schreibt den Ordnerinhalt in die temp. Datei, das neuste ganz oben 06.
dir %PFAD% /b /O:-D > %temp%\dirlist.txt 07.
08.
:: Schreibt die erste Zeile in DATEI1 09.
for /f "tokens=1,* delims=:" %%i in ('findstr /n $ %temp%\dirlist.txt') do @( 10.
for /L %%a in (1,1,1) do @if %%i==%%a @set DATEI1=%%j 11.
) 12.
13.
:: Schreibt die zweite Zeile in DATEI2 14.
for /f "tokens=1,* delims=:" %%i in ('findstr /n $ %temp%\dirlist.txt') do @( 15.
for /L %%a in (2,1,2) do @if %%i==%%a @set DATEI2=%%j 16.
) 17.
18.
:: Schreibt die dritte Zeile in DATEI3 19.
for /f "tokens=1,* delims=:" %%i in ('findstr /n $ %temp%\dirlist.txt') do @( 20.
for /L %%a in (3,1,3) do @if %%i==%%a @set DATEI3=%%j 21.
) 22.
23.
:: Erstellt einen temp. backup-ordner 24.
mkdir "%PFAD%\temp" 25.
26.
:: Verschiebt die 3 letzten Backups in den temp Ordner 27.
move "%PFAD%\%DATEI1%" %PFAD%\temp\ 28.
move "%PFAD%\%DATEI2%" %PFAD%\temp\ 29.
move "%PFAD%\%DATEI3%" %PFAD%\temp\ 30.
31.
:: Löscht alle Dateien im eingangs angegeben Ordner 32.
echo j | del %PFAD%\* 33.
34.
:: Verschiebt die zu 3 letzten Backups zurück und entfernt den temp Ordner 35.
cd %PFAD% 36.
move backup\* ./ 37.
rd backupGruß Dark
Biber schreibt am 12.01.2010 um 16:15:30 Uhr
Moin derDunkleLurch,
Ja, aber....diese Anforderung hatten wir auch schon ein paar Male hier im Forum...
Dann also statt DIR-Parameter /Ad genau umgekehrt (/a-d) und statt [RD Unterverzeichnis "%~i"] natürlich ein einfaches [del Datei "%~i"].
Grüße
Biber
Ja, aber....diese Anforderung hatten wir auch schon ein paar Male hier im Forum...
Aber handelt es sich nicht um Backup-Dateien? Du schreibst was von UnterORDNERN ?!
Doch, da hast du Recht. Ich hatte zu flüchtig gelesen. ...Dann also statt DIR-Parameter /Ad genau umgekehrt (/a-d) und statt [RD Unterverzeichnis "%~i"] natürlich ein einfaches [del Datei "%~i"].
Grüße
Biber
user2009 schreibt am 13.01.2010 um 01:23:39 Uhr
Hallo Biber,
vielen Dank es klappt super:
Gruß
user2009
vielen Dank es klappt super:
01.
set "PFAD=d:\temp1" 02.
03.
echo "Unterordner löschen" 04.
FOR /F "skip=3 delims=" %%i in ('Dir /ad /b /o-d %PFAD%') do (@echo rd "%PFAD%\%%i" /s /q) 05.
:: vom CMD-Pompt aus würden alle Verzeichnisse unterhalb von D:\temp ausgenommen die 3 06.
:: jüngsten gelöscht (bzw das Löschen mit "ECHO rd" angezeigt). 07.
pause 08.
09.
echo. 10.
echo "Backup-Dateien löschen" 11.
FOR /F "skip=3 delims=" %%i in ('Dir /a-d /b /o-d %PFAD%\') do (@echo del "%PFAD%\%%i" /s /q &&echo "%%i">>del.txt) 12.
:: neu: dir /a-d und del "%%i" 13.
pauseGruß
user2009
TheDarkLord schreibt am 13.01.2010 um 10:43:52 Uhr
Hallo 
Danke für die Blumen xD
Hatte noch nen Fehler im Script, für den Fall, dass Du (oder jemand anderes) das umfangreichere von mir nehmen möchte, weil man da noch einiges zwischen basteln kann wie nen Log, welche Datei die aktuellste ist bzw. wann das letzte Backup lief etc:
Gruß Dark
Danke für die Blumen xD
Hatte noch nen Fehler im Script, für den Fall, dass Du (oder jemand anderes) das umfangreichere von mir nehmen möchte, weil man da noch einiges zwischen basteln kann wie nen Log, welche Datei die aktuellste ist bzw. wann das letzte Backup lief etc:
01.
:: Das Script darf natürlich NICHT in dem Ordner liegen, wo die zu löschenden Backups sind, sonst wirds ja mit gelöscht :) 02.
03.
set "PFAD=Ordner-indem-die-zu-löschenden-backups-drin-sind" 04.
05.
:: Schreibt den Ordnerinhalt in die temp. Datei, das neuste ganz oben 06.
dir %PFAD% /b /O:-D > %temp%\dirlist.txt 07.
08.
:: Schreibt die erste Zeile in DATEI1 09.
for /f "tokens=1,* delims=:" %%i in ('findstr /n $ %temp%\dirlist.txt') do @( 10.
for /L %%a in (1,1,1) do @if %%i==%%a @set DATEI1=%%j 11.
) 12.
13.
:: Schreibt die zweite Zeile in DATEI2 14.
for /f "tokens=1,* delims=:" %%i in ('findstr /n $ %temp%\dirlist.txt') do @( 15.
for /L %%a in (2,1,2) do @if %%i==%%a @set DATEI2=%%j 16.
) 17.
18.
:: Schreibt die dritte Zeile in DATEI3 19.
for /f "tokens=1,* delims=:" %%i in ('findstr /n $ %temp%\dirlist.txt') do @( 20.
for /L %%a in (3,1,3) do @if %%i==%%a @set DATEI3=%%j 21.
) 22.
23.
:: Erstellt einen temp. backup-ordner 24.
mkdir "%PFAD%\temp" 25.
26.
:: Verschiebt die 3 letzten Backups in den temp Ordner 27.
move "%PFAD%\%DATEI1%" %PFAD%\temp\ 28.
move "%PFAD%\%DATEI2%" %PFAD%\temp\ 29.
move "%PFAD%\%DATEI3%" %PFAD%\temp\ 30.
31.
:: Löscht alle Dateien im eingangs angegeben Ordner 32.
echo j | del %PFAD%\* 33.
34.
:: Verschiebt die 3 letzten Backups zurück und entfernt den temp Ordner 35.
cd %PFAD% 36.
move temp\* ./ 37.
rd temp 38.
del %temp%\dirlist.txt Gruß Dark
user2009 schreibt am 13.01.2010 um 12:04:27 Uhr
Hallo Dark,
Ja für Logs, die man sich selbst zusammen baut, ist das Script gut geeignet.
Um jedoch Unterordner auszusortieren und zu verschieben sollte nicht %PFAD%\temp, sondern ein %neuerPFAD% verwendet werden und statt mit "move" lieber mit "robocopy.exe .... /move" gearbeitet werden.
(Zur automatischen Unterscheidung, ob es sich um Dateien oder Verzeichnisse handelt gibt es diesen "forfiles"-Code:
)
Also Danke noch mal und Gruß
User2009
del %temp%\dirlist.txt
o.k.Ja für Logs, die man sich selbst zusammen baut, ist das Script gut geeignet.
Um jedoch Unterordner auszusortieren und zu verschieben sollte nicht %PFAD%\temp, sondern ein %neuerPFAD% verwendet werden und statt mit "move" lieber mit "robocopy.exe .... /move" gearbeitet werden.
(Zur automatischen Unterscheidung, ob es sich um Dateien oder Verzeichnisse handelt gibt es diesen "forfiles"-Code:
01.
:: console 02.
FOR /F "delims=" %i in ('forfiles /s /c "CMD /C if @ISDIR==TRUE echo @FILE ist ein Verzeichnis"') do (pause && goto robocopy)Also Danke noch mal und Gruß
User2009










