Automatisches Backup mit Batch Datei

-Rayz-

Lieutenant
Dabei seit
Okt. 2010
Beiträge
885
Guten Tag,

ich habe einen Ordner wo meine Server-Exports gespeichert werden. Der Inhalt von diesem Ordner sind also weitere Ordner mit dem Datum als Namen.

Nun wollte ich ein mal pro Woche diese Ordner mit 7zip zippen und am ende des Monats ein Monatsbackup machen. Nach ca. 3 Monaten kann dann das älteste Backup gelöscht werden. Dadurch habe ich immer die letzten 3 Monate als Backup und vom aktuellen Monat jeweils die Wochen als Backup.

Dies wollte ich nun mit einer Batchdatei ohne Erfahrung realisieren. Google spuckt natürlich viele einzelne Befehle aus aber komme damit auf keinen grünen Zweig.

Als Test hatte ich folgendes probiert:

Code:
if exist backup5.7z del backup5.7z
if exist backup4.7z ren backup4.7z backup5.7z
if exist backup3.7z ren backup3.7z backup4.7z
if exist backup2.7z ren backup2.7z backup3.7z
if exist backup.7z ren backup.7z backup2.7z
7z u backup -up1q3r2x1y2z1w2 @backup.txt

Hier habe ich am Ende fünf Dateien wovon die älteste immer überschrieben wird. Den Ordnerpfad habe ich in der backup.txt Datei angegeben.

diese Datei macht natürlich nicht das, was ich vorhatte. Ich weiss auch nciht wie ich da rangehen soll. Ich muss ja erst einmal herausfinden, was für Monatbackups und Wochenbackups existieren. Nach 4 Wochenbackups soll daraus ein Monatsbackup gemacht werden. Nach 3 Monatsbackups kann immer das älteste Backup gelöscht werden.

Kann mir bitte wer helfen, wie ich da rangehen soll?


mfg -Rayz-
 
was genau geht denn nicht?

starte am besten so, dass du nach jedem befehl "pause" setzt


Code:
if exist backup5.7z del backup5.7z
pause
if exist backup4.7z ren backup4.7z backup5.7z
pause
if exist backup3.7z ren backup3.7z backup4.7z
pause

Parallel öffnest du den ordnerpfad und prüfst was genau passiert.
Die "if" Befehle sind alle korrekt. Allerdings sollte die Batch am richtigen Pfad stehen.
Evtl. den Arbeitspfad übergeben. Das Kannst du ganz simpel so machen:

Code:
D:
cd backup
cd unterordner
if exist backup5.7z del backup5.7z
pause
if exist backup4.7z ren backup4.7z backup5.7z
pause
if exist backup3.7z ren backup3.7z backup4.7z
pause
 
fertige Lösungen kann ich nicht nutzen.

@h00bi

die Batch Datei funktioniert ja. Mein PRoblem ist eher, dass ich nicht weiss, wie ich nun weiter vorgehen soll um mein Ziel zu erreichen.

Ich muss ja irgendwie bereits vorhandene Daten anhand des Datums ermitteln und dann entsprechend zippen bzw. löschen oder überschreiben.
 
Ich muss ja irgendwie bereits vorhandene Daten anhand des Datums ermitteln und dann entsprechend zippen bzw. löschen oder überschreiben.

versuch irgenwie mit "date" und "sysdate" zu arbeiten.
einfache Ausgabe der Systemzeit findest du in folgendem Beispiel:

http://www.allguru.net/error-solution/sysdate-1-dos-batch-command/

vielleicht hilft dir auch das weiter:

http://www.computing.net/answers/programming/batch-to-move-file-by-sysdate/14939.html

oder das:

http://stackoverflow.com/questions/51054/batch-file-to-delete-files-older-than-n-days
 
Zuletzt bearbeitet:
meien batch logik war:
tägliches sync'en - alle 2 wochen packen, mit datum versehen und wegkopieren.
habe damals alles mit dem aktuellen datum versehen(das backup) und monatsordner/jahresordner erstellt. nach jedem erfolgreichen backup habe ich den sync ordner gelöscht um alt bestände zu eliminieren.

auf dem Backupserver hatte ich dann folgende struktur:
2012/
-------Januar/
---------------Backup140112.rar
---------------Backup300112.rar
-------Februar/
---------------Backup140212.rar
---------------Backup290212.rar

das löschen von backup's habe ich damals nicht implementiert - das wurde dann von hand gemacht.
Zusätzlich hatte ich noch ne logik die überprüft hat ob ein 2 wochen backup schon erstellt wurde oder noch benötigt wurde(falls z.b. das backup am 15 nicht ausgeführt werden konnte)


p.s. und wenn du löschen willst, kannst einfach die jeweiligen ordner per batch löschen.
 
Natürlich ungetestet:
Code:
set dir_monatsbackup=X:\backups\
set name_monatsbackup=monat
set dir_wochenbackup=X:\backups\
set name_wochenbackup=woche

:: wenn letztes wochenbackup, monatsbackup durchgehen
if exist "%dir_wochenbackup%\%name_wochenbackup%5.7z" do (
	if exist "%dir_monatsbackup%\%name_monatsbackup%3.7z" del "%dir_monatsbackup%\%name_monatsbackup%3.7z"
	if exist "%dir_monatsbackup%\%name_monatsbackup%2.7z" move "%dir_monatsbackup%\%name_monatsbackup%2.7z" "%dir_monatsbackup%\%name_monatsbackup%3.7z"
	if exist "%dir_monatsbackup%\%name_monatsbackup%1.7z" move "%dir_monatsbackup%\%name_monatsbackup%1.7z" "%dir_monatsbackup%\%name_monatsbackup%2.7z"
	:: letztes wochenbackup zu monatsbackups verschieben
	if exist "%dir_wochenbackup%\%name_wochenbackup%5.7z" move "%dir_wochenbackup%\%name_wochenbackup%5.7z" "%dir_monatsbackup%\%name_monatsbackup%1.7z"
)
:: wochenbackups rotieren
if exist "%dir_wochenbackup%\%name_wochenbackup%4.7z" move "%dir_wochenbackup%\%name_wochenbackup%4.7z" "%dir_wochenbackup%\%name_wochenbackup%5.7z"
if exist "%dir_wochenbackup%\%name_wochenbackup%3.7z" move "%dir_wochenbackup%\%name_wochenbackup%3.7z" "%dir_wochenbackup%\%name_wochenbackup%4.7z"
if exist "%dir_wochenbackup%\%name_wochenbackup%2.7z" move "%dir_wochenbackup%\%name_wochenbackup%2.7z" "%dir_wochenbackup%\%name_wochenbackup%3.7z"
if exist "%dir_wochenbackup%\%name_wochenbackup%1.7z" move "%dir_wochenbackup%\%name_wochenbackup%1.7z" "%dir_wochenbackup%\%name_wochenbackup%2.7z"

:: aktuelles wochenbackup anlegen
7z u ... "%dir_wochenbackup%\%name_wochenbackup%1.7z"
 
Zuletzt bearbeitet:
ok.. habe nun viel zu testen. Vielen Dank !
Ergänzung ()

Mit dem Beispiel von Yuuri funktioniert es ja schon sehr gut.
Zwei Fragen hätte ich dazu aber noch.

Erste Frage:

Die Batch Datei führe ich ja im gleichen Ordner aus, wo die Backups ungezippt liegen. D.h. dass in jeden gezippten Backup die Batch Datei enthalten ist. Nun würde ich gerne die Batch aus einem anderen Ordner heraus starten wollen.

Code:
7z u -up1q3r2x1y2z1w2 "%dir_wochenbackup%\%name_wochenbackup%1.7z"

rufe ich das PRogramm so auf, dann werden die Dateien aus dem Ordner gezippt, in dem die Batchdatei ausgeführt wird.
Wie kann ich denn den Pfad ändern?

Code:
..."%dir_wochenbackup%\...
hier steht ja der Speicherort...
 
Code:
Usage: 7z <command> [<switches>...] <archive_name> [<file_names>...]
       [<@listfiles...>]
;)
Code:
7z ... "%dir_wochenbackup%\%name_wochenbackup%1.7z" "X:\dateien\in\diesem\pfad\*"
 
oh... danke ^^

ich glaube aber, dass in dem Code ein Denkfehler drin ist.

Sobald ich alle Wochen habe und das erste Monatsbackup erstellt wird, wird danach jede Woche zu einem Monatsbackup.

Ich habe:

Woche 1
Woche 2
Woche 3
Woche 4 -> Es wird überprüft ob 1 2 3 und 4 existiert. Wenn 4 vorhanden ist = Monatsbackup
ABER Woche 3 wird dnan zur Woche 4d.h Woche 4 ist wieder vorhanden also wieder = Monatsbackup

Dabei dürfte nach dem ersten Monatsbackup ja weitere 4 Wochen nichts kommen dürfen.

Ich hoffe ich hab es nun richtig erklärt...

Edit: Lösung wäre ja doch, wenn ich nach dem Monatsupdate die Wochenupdates lösche. Werden dann eh nicht mehr benötigt weil im Monatsexport alle SQL Daten von den 4 Wochen enthalten sind.
 
Zuletzt bearbeitet:
Hm achso ja klar. Das Einfachste wär dann wohl, es auf zwei Batch-Dateien zu splitten. Einfache String-Vergleiche mit Daten per Batch fallen mir auf Anhieb nicht ein.

Außer du würdest irgendwo einen Zähler hinterlegen und wenn dieser > 4 ist, du das Monatsbackup ausführst und diesen zurücksetzt. Wäre dann aber natürlich abhängig von einer Datei irgendwo.
 
evtl. so?

Code:
set Woche=1

:Loop

IF %Woche% == 4 ( set Woche = 1)
echo %Woche% >> Anzahl_Woche.txt
set /a Woche=%Woche%+1
goto Loop

Problem hier ist aber, dass ich ja nach jeder neuen Woche die Variable wieder auf 1 setze.... mmmmh

Edit: sehe gerade, dass ich mir den Wert aus der .txt gar nicht hole... wie komme ich denn an den Wert ran? echo Anzahl_Woche.txt >> %Woche" geht ja bestimmt nicht ^^
 
Du hängst an. > überschreibt, >> hängt an. Hättest also irgendwann ein Konstrukt wie 12341234 etc.

Daten holen kannst du mit
Code:
set /P woche=< dateiname
 
Also ich muss eine Variable setzen und muss diese dann wieder zurücksetzen, wnen ich Woche 4 erreicht habe.
Datei1:
Code:
set Woche = 1

Datei2:

Code:
set /P Woche=< Datei1

:setWoche
IF %Woche% == 4 (
set %Woche% = 1
echo %Woche% >> Datei1
)
goto Loop

:Loop
 
set /a Woche=%Woche%+1
echo %Woche% >> Datei1
 
Nein, du musst die Woche nur einmalig speichern und abrufen.
Code:
set woche=0
if exist "X:\tmp\woche.txt" set /P woche=< "X:\tmp\woche.txt"
set /A woche=%woche% + 1

if %woche% eq 4 do (
set woche=0
:: hier monatsbackup
)

:: hier wochenbackup

echo %woche% > "X:\tmp\woche.txt"
So steht in woche.txt nur drin, in der wievielten Woche das Backup steckt. Alternativ könntest du auch stur das Datum abfragen und nach dem 15. o.ä. jeden Monats prüfen. Wäre vielleicht die bessere Variante.
 
Das mit dem Speichern in einer Datei mag nicht funktionieren...

Code:
    set woche=0
    if exist "C:\Dokumente und Einstellungen\rkaschwit\Desktop\Batch\woche.txt" set /P woche=< "C:\Dokumente und Einstellungen\******\Desktop\Batch\woche.txt"
    set /A woche=%woche% + 1

Die Datei im Ordner "Batch" habe ich natürlich angelegt ( woche.txt ). Solle sich nach dem Ausführen der .bat in dieser Datei dann nicht die Variable "woche" befinden oder muss ich dazu noch etwas in der woche.txt schreiben?

%woche% oder > funktionieren auch nicht



Edit: Kopf->Tisch .. ich sollte auch in die woche.txt eine Zahl reinschreiben damit es geht... -_-

Edit2: Mit dem EQ ging es irgendwie nicht aber so geht es nun:

Code:
if %woche% EQU 4 (	....
Ergänzung ()

Hier nun der komplette Code:


Code:
set dir_monatsbackup=C:\Dokumente und Einstellungen\****\Desktop\Monat
set name_monatsbackup=monat
set dir_wochenbackup=C:\Dokumente und Einstellungen\****\Desktop\Wochen
set name_wochenbackup=woche
 

set woche=0
if exist "C:\Dokumente und Einstellungen\****\Desktop\Batch\woche.txt" set /P woche=< "C:\Dokumente und Einstellungen\****\Desktop\Batch\woche.txt"
set /A woche =%woche% + 1

 
if %woche% EQU 4 (	
	
	set woche=0
   
		if exist "%dir_wochenbackup%\%name_wochenbackup%3.7z" do (
		if exist "%dir_monatsbackup%\%name_monatsbackup%3.7z" del "%dir_monatsbackup%\%name_monatsbackup%3.7z"
		if exist "%dir_monatsbackup%\%name_monatsbackup%2.7z" move "%dir_monatsbackup%\%name_monatsbackup%2.7z" "%dir_monatsbackup%\%name_monatsbackup%3.7z"
		if exist "%dir_monatsbackup%\%name_monatsbackup%1.7z" move "%dir_monatsbackup%\%name_monatsbackup%1.7z" "%dir_monatsbackup%\%name_monatsbackup%2.7z"
		
		if exist "%dir_wochenbackup%\%name_wochenbackup%2.7z" del "%dir_wochenbackup%\%name_wochenbackup%2.7z"
		if exist "%dir_wochenbackup%\%name_wochenbackup%3.7z" del "%dir_wochenbackup%\%name_wochenbackup%3.7z"
		if exist "%dir_wochenbackup%\%name_wochenbackup%1.7z" del "%dir_wochenbackup%\%name_wochenbackup%1.7z"
		
		
		echo %woche% > "C:\Dokumente und Einstellungen\****\Desktop\Batch\woche.txt"
		7z u -up1q3r2x1y2z1w2 "%dir_monatsbackup%\%name_monatsbackup%1.7z" "C:\Dokumente und Einstellungen\****\Desktop\SZG"
		
		)		
    )
	
else (	

if exist "%dir_wochenbackup%\%name_wochenbackup%2.7z" move "%dir_wochenbackup%\%name_wochenbackup%2.7z" "%dir_wochenbackup%\%name_wochenbackup%3.7z"
if exist "%dir_wochenbackup%\%name_wochenbackup%1.7z" move "%dir_wochenbackup%\%name_wochenbackup%1.7z" "%dir_wochenbackup%\%name_wochenbackup%2.7z"
	    
echo %woche% > "C:\Dokumente und Einstellungen\****\Desktop\Batch\woche.txt"

7z u -up1q3r2x1y2z1w2 "%dir_wochenbackup%\%name_wochenbackup%1.7z" "C:\Dokumente und Einstellungen\****\Desktop\SZG"

)


Klappt noch nicht so wie ich es gerne hätte...
So soll es laufen:
Woche 1 , Woche 2 und Woche 3 wird erstellt. Danach wird aus dem nächsten SQL Export kein Wochen sondern Monatsbackup erstellt und die Wochenbackups sollen alle gelöscht werden.
Problem ist aber, dass dennoch Woche1 erstellt wird sowie Monat1. Der Monat ist ja richtig aber ich verstehe nicht, wieso dennoch ein Backup Woche1 erstellt wird. Ich habe das doch mit einem "else" abgefangen.

Kurz gesagt: Zähler auf 4 dann sollen alle Wochen weg sein und ein neuer Monat angelegt werden. Es wird aber zusätzlich Woche1 erstellt trotz "else".
 
Zuletzt bearbeitet:
Hi -Rayz-/Yuuri,

erstmal: Respekt euch beiden. Hab mal versucht mich einzulesen/-arbeiten. War gar nicht so leicht.

Kopfkino allein hat bei mir allerdings nicht ganz gereicht, um einen Fehler zu finden (hoffe zumindest ihn gefunden zu haben ;)).
Habe das so in etwa durchlaufen lassen (mit "ECHO ON" & "PAUSE" zum Schluss). Mir fiel auf, dass der Befehl "ELSE" nicht angenommen wird, bzw. das mit der Klammer nicht ganz so hinhaut.

So müsste es funktionieren:
Code:
...
ECHO M > "%dir_monatsbackup%\%name_monatsbackup%1.7z"
        
        )        
    ) Else (    
 
if exist "%dir_wochenbackup%\%name_wochenbackup%2.7z" move "%dir_wochenbackup%\%name_wochenbackup%2.7z" "%dir_wochenbackup%\%name_wochenbackup%3.7z"
...

Interessant finde ich vor allem -> ohne irgendeine notwendig Sprungmarke!
 
So, habs mal ein wenig ausgebaut und durchgetestet.

Du kannst oben alles an Parametern ändern, ein Log ist eingebaut und ich hab die die Abhängigkeit der Wochenzahl durch das Datum ersetzt. Jetzt läuft es so, dass immer vor dem 8. des Monats ein Wochenbackup erstellt wird, sodass definitiv jeden Monat ein Backup gemacht wird. Bei der Verwendung der Zählerdatei wäre ich eher vorsichtig, da die 30/31/27/28 Tage und das Schaltjahr wohl irgendwann Probleme machen und das "Monatsbackup", dann nicht mehr monatlich gemacht wird, sondern immer mit einem gewissen Abstand (eben stur alle vier Wochen und 365 Tage haben ja 4,34 Wochen ;)).

Einzige Bedingung: das Script wöchentlich starten. ;)

Code:
----------------------------- Backupeinstellungen  ----------------------------- 
[06.02.2013 20:43:07,24] Pfad des Backups:               D:\Desktop\claW\backup\src 
[06.02.2013 20:43:07,24] Pfad des Monatsbackups:         D:\Desktop\claW\backup\backups 
[06.02.2013 20:43:07,24] Name des Monatsbackups:         monat 
[06.02.2013 20:43:07,24] Pfad des WochenBackups:         D:\Desktop\claW\backup\backups 
[06.02.2013 20:43:07,24] Name des WochenBackups:         woche 
[06.02.2013 20:43:07,24] Monatsbackups immer rotieren vor dem 7. Monats 
[06.02.2013 20:43:07,24] 
[06.02.2013 20:43:07,24] Einstellungen für externe Tools: 
[06.02.2013 20:43:07,24] 
[06.02.2013 20:43:07,24] Parameter für move:             /y 
[06.02.2013 20:43:07,24] 
[06.02.2013 20:43:07,24] Pfad von 7-Zip:                 C:\Program Files\7-Zip\7z.exe 
[06.02.2013 20:43:07,24] Parameter für 7-Zip:            u 
[06.02.2013 20:43:07,24] Dateierweiterung der Backups:   7z 
-------------------------------------- Log  ------------------------------------- 
[06.02.2013 20:43:07,24] Pfad des Monatsbackups erstellt 
[06.02.2013 20:43:07,24] Tag des Monatsbackups erreicht 
[06.02.2013 20:43:07,24] aktuelles Backup erzeugen 
-------------------------------------------------------------------------------- 
[06.02.2013 20:43:18,45] Tag des Monatsbackups erreicht 
[06.02.2013 20:43:18,45] Wochenbackup 1 rotieren 
[06.02.2013 20:43:18,45] aktuelles Backup erzeugen 
-------------------------------------------------------------------------------- 
[06.02.2013 20:43:29,12] Tag des Monatsbackups erreicht 
[06.02.2013 20:43:29,13] Wochenbackup 2 rotieren 
[06.02.2013 20:43:29,13] Wochenbackup 1 rotieren 
[06.02.2013 20:43:29,13] aktuelles Backup erzeugen 
-------------------------------------------------------------------------------- 
[06.02.2013 20:43:39,33] Tag des Monatsbackups erreicht 
[06.02.2013 20:43:39,33] Wochenbackup 3 rotieren 
[06.02.2013 20:43:39,33] Wochenbackup 2 rotieren 
[06.02.2013 20:43:39,34] Wochenbackup 1 rotieren 
[06.02.2013 20:43:39,34] aktuelles Backup erzeugen 
-------------------------------------------------------------------------------- 
[06.02.2013 20:43:49,44] Tag des Monatsbackups erreicht 
[06.02.2013 20:43:49,44] Wochenbackup 4 zu Monatsbackup rotieren 
[06.02.2013 20:43:49,44] Wochenbackup 3 rotieren 
[06.02.2013 20:43:49,44] Wochenbackup 2 rotieren 
[06.02.2013 20:43:49,44] Wochenbackup 1 rotieren 
[06.02.2013 20:43:49,44] aktuelles Backup erzeugen 
-------------------------------------------------------------------------------- 
[06.02.2013 20:43:59,59] Tag des Monatsbackups erreicht 
[06.02.2013 20:43:59,59] Monatsbackup 1 rotieren 
[06.02.2013 20:43:59,59] Wochenbackup 4 zu Monatsbackup rotieren 
[06.02.2013 20:43:59,60] Wochenbackup 3 rotieren 
[06.02.2013 20:43:59,60] Wochenbackup 2 rotieren 
[06.02.2013 20:43:59,60] Wochenbackup 1 rotieren 
[06.02.2013 20:43:59,60] aktuelles Backup erzeugen 
-------------------------------------------------------------------------------- 
[06.02.2013 20:44:09,75] Tag des Monatsbackups erreicht 
[06.02.2013 20:44:09,75] Monatsbackup 2 rotieren 
[06.02.2013 20:44:09,75] Monatsbackup 1 rotieren 
[06.02.2013 20:44:09,75] Wochenbackup 4 zu Monatsbackup rotieren 
[06.02.2013 20:44:09,76] Wochenbackup 3 rotieren 
[06.02.2013 20:44:09,76] Wochenbackup 2 rotieren 
[06.02.2013 20:44:09,76] Wochenbackup 1 rotieren 
[06.02.2013 20:44:09,76] aktuelles Backup erzeugen 
-------------------------------------------------------------------------------- 
[06.02.2013 20:44:19,92] Tag des Monatsbackups erreicht 
[06.02.2013 20:44:19,92] letztes Monatsbackup loeschen 
[06.02.2013 20:44:19,92] Monatsbackup 2 rotieren 
[06.02.2013 20:44:19,92] Monatsbackup 1 rotieren 
[06.02.2013 20:44:19,92] Wochenbackup 4 zu Monatsbackup rotieren 
[06.02.2013 20:44:19,93] Wochenbackup 3 rotieren 
[06.02.2013 20:44:19,93] Wochenbackup 2 rotieren 
[06.02.2013 20:44:19,94] Wochenbackup 1 rotieren 
[06.02.2013 20:44:19,94] aktuelles Backup erzeugen 
--------------------------------------------------------------------------------
 

Anhänge

  • backup.7z
    1 KB · Aufrufe: 628
Uff Vielen Dank!
Werde heute Abend wohl erst zum testen kommen. Also werde ich wahrscheinlich morgen dann die ein oder andere Frage haben ^^
 
Hallo, tut mir leid wenn ich dieses alte, für mich jedoch hochaktuelle, Thema ausgrabe. Ich bräuchte zwecks automatischer Backups Hilfe.
Genauer gesagt geht es mir darum, das ich einen Ordner mit Speicherständen eines Spieles sichern lassen möchte.
Ich möchte also wenn möglich, dass nach Spielstart ein sofortiges Backup, und alle weiteren x Minuten weitere Backups der Dateien angelegt werden. Dazu sollen diese gepackt und jeweils das älteste Backup bei x vorhandenen Sicherungen gelöscht werden.

Ist das möglich, und wenn ja, wie? Da ich absolut keine Ahnung von Batchbefehlen und solchen Dingen habe, würde ich mich freuen, wenn mir da jemand helfen könnte, und zudem auch genau erklärt was da passiert.

Natürlich habe ich mich im Vorfeld ausreichend informiert, sämtliche Suchen genutzt und allemöglichen Seiten gelesen, aber je mehr ich mich damit befasst habe, umso komplizierter wurde es für mich. Scheint ein rotes Tuch zu sein :(
 
Zurück
Top