Backup-Script für Minecraft-Server

Hidden Evil

Moderator
Teammitglied
Moin Leute,

ich habe mich mal heute etwas intensiver mit Batch befasst und ein Script zusammengebastelt, das per Knopfdruck den World-Ordner (oder alle 3 bei Bukkit) separat abspeichert, und zwar getrennt nach Datum und Uhrzeit. Ich hoffe, es ist für Euch eine Hilfe, ich habe es unter Win7 Home Premium getestet und für funktionierend befunden. Ebenso wurde es bereits auf dem SNF-eigenen Server ausprobiert und funktioniert tadellos.

verborgener Text:
Code:
@echo off

rem ----- Zeile 4 aus server.properties auslesen -----
rem - Es muss in Zeile 4 der Eintrag des Weltnamens vorliegen, ansonsten "skip" anpassen!
rem - Bei skip=3 werden 3 Zeilen übersprungen, die server.properties wird temporär ohne Zeilen 1-3
rem - abgespeichert. Zeile 1 (Zeile 4 in der Originalversion) wird abgefragt und gespeichert.
rem - Die temporäre Datei wird anschliessend geloescht.
For /F "tokens=* skip=3" %%a IN (server.properties) DO echo %%a>>TEMP.txt
set /p WORLD=<TEMP.txt
del TEMP.txt

rem ----- Eintrag splitten, damit nur Weltname uebrig bleibt -----
rem - aus "level-name=xyz" wird "xyz" 
for /f "tokens=2 delims== " %%a in ("%WORLD%") do set WORLD=%%a

rem ----- Uhrzeit ermitteln und Trennzeichen austauschen -----
rem - Uhrzeit wird ohne Milisekunden abgefragt und in 3 Teile geteilt. Diese werden
rem - mit anderen Trennzeichen wieder zusammengefuegt, da Doppelpunkte unzulässig sind!
for /f "tokens=1,2,3 delims=: " %%a in ("%time:~0,8%") do set HH=%%a&set MM=%%b&set SS=%%c
set zeit=%HH%_%MM%_%SS%

rem ----- Backup-Verzeichnisse erstellen -----
rem - Existenz der Weltenverzeichnisse (bei Bukkit alle 3, bei Classic nur der erste) werden
rem - geprueft und Backup-Verzeichnisse erstellt. Unterteilt in Datum\Uhrzeit\Teilwelt
if exist %WORLD%         md BACKUP\%DATE%\%zeit%\%WORLD%
if exist %WORLD%_nether  md BACKUP\%DATE%\%zeit%\%WORLD%_nether
if exist %WORLD%_the_end md BACKUP\%DATE%\%zeit%\%WORLD%_the_end

rem ----- Welt-Verzeichnisse von Bukkit in Backup-Verzeichnisse kopieren -----
rem - Sofern die Weltenverzeichnisse existieren wird der gesamte Inhalt in
rem - die zuvor erstellten Backup-Verzeichnisse kopiert.
if exist %WORLD%         xcopy %WORLD%         BACKUP\%DATE%\%zeit%\%WORLD%\ /Y /E /S /Q
if exist %WORLD%_nether  xcopy %WORLD%_nether  BACKUP\%DATE%\%zeit%\%WORLD%_nether\ /Y /E /S /Q
if exist %WORLD%_the_end xcopy %WORLD%_the_end BACKUP\%DATE%\%zeit%\%WORLD%_the_end\ /Y /E /S /Q

verborgener Text:
Code:
@echo off
title MC-Auto-Backup
:start
rem ----- Zeile 4 aus server.properties auslesen -----
rem - Es muss in Zeile 4 der Eintrag des Weltnamens vorliegen, ansonsten "skip" anpassen!
rem - Bei skip=3 werden 3 Zeilen übersprungen, die server.properties wird temporär ohne Zeilen 1-3
rem - abgespeichert. Zeile 1 (Zeile 4 in der Originalversion) wird abgefragt und gespeichert.
rem - Die temporäre Datei wird anschliessend geloescht.
For /F "tokens=* skip=3" %%a IN (server.properties) DO echo %%a>>TEMP.txt
set /p WORLD=<TEMP.txt
del TEMP.txt

rem ----- Eintrag splitten, damit nur Weltname uebrig bleibt -----
rem - aus "level-name=xyz" wird "xyz" 
for /f "tokens=2 delims== " %%a in ("%WORLD%") do set WORLD=%%a

rem ----- Uhrzeit ermitteln und Trennzeichen austauschen -----
rem - Uhrzeit wird ohne Milisekunden abgefragt und in 3 Teile geteilt. Diese werden
rem - mit anderen Trennzeichen wieder zusammengefuegt, da Doppelpunkte unzulässig sind!
for /f "tokens=1,2,3 delims=: " %%a in ("%time:~0,8%") do set HH=%%a&set MM=%%b&set SS=%%c
set zeit=%HH%_%MM%_%SS%

rem ----- Backup-Verzeichnisse erstellen -----
rem - Existenz der Weltenverzeichnisse (bei Bukkit alle 3, bei Classic nur der erste) werden
rem - geprueft und Backup-Verzeichnisse erstellt. Unterteilt in Datum\Uhrzeit\Teilwelt
if exist %WORLD%         md BACKUP\%DATE%\%zeit%\%WORLD%
if exist %WORLD%_nether  md BACKUP\%DATE%\%zeit%\%WORLD%_nether
if exist %WORLD%_the_end md BACKUP\%DATE%\%zeit%\%WORLD%_the_end

rem ----- Welt-Verzeichnisse von Bukkit in Backup-Verzeichnisse kopieren -----
rem - Sofern die Weltenverzeichnisse existieren wird der gesamte Inhalt in
rem - die zuvor erstellten Backup-Verzeichnisse kopiert.
if exist %WORLD%         xcopy %WORLD%         BACKUP\%DATE%\%zeit%\%WORLD%\ /Y /E /S /Q
if exist %WORLD%_nether  xcopy %WORLD%_nether  BACKUP\%DATE%\%zeit%\%WORLD%_nether\ /Y /E /S /Q
if exist %WORLD%_the_end xcopy %WORLD%_the_end BACKUP\%DATE%\%zeit%\%WORLD%_the_end\ /Y /E /S /Q

echo Backup erledigt - %DATE% - %time:~0,8%
echo ---------------------------------------

ping 127.0.0.1 /n 1 /w 86400000 > nul

goto start

Es wird die server.properties ausgelesen, um den Namen der World festzustellen, damit die Verzeichnisse entsprechend erfasst und kopiert werden können. Wichtig hierbei ist nur, dass der Eintrag des World-Namens in Zeile 4 Stehen muss, andernfalls ist wie im Code beschrieben der Eintrag zu ändern.

Der Rest geschieht völlig automatisch. Es wird ein Verzeichnis namens "BACKUP" erstellt, in welches erst nach Datum getrennt wird und während des selben Tages als Unterverzeichnis nach der Uhrzeit.
 
Zuletzt bearbeitet:

bastla

mit bastla_Assi
Das ganze jetzt noch in Java und dann als Bukkit-Plugin ;).

Danke dafür, ist bei eigenen Server bestimmt sehr nützlich (y)!
Jetzt bräuchte man nur noch ein Script, dass dieses Script alle 60 Minuten aufruft :D.

Gruß
bastla
 

Hidden Evil

Moderator
Teammitglied
Jetzt bräuchte man nur noch ein Script, dass dieses Script alle 60 Minuten aufruft :D.

Lässt sich mit Batch sogar machen, soweit ich weiß, jedoch sind meine Kenntnisse noch arg begrenzt. Aber ich möchte nur ungern neben dem so schon hardwarehungrigen MC-Server ein extra Backupscript permanent auf Supis Kiste laufen lassen. Mal sehen, ob ich das recourcenschonend hinbekomme :)

EDIT:
Ich habe eine 2. Version mit automatischem 24-Stunden-Backup hinzugefügt.
 
Zuletzt bearbeitet:

bastla

mit bastla_Assi
ot:
Alternativ hätte man auch 86400000 Ping-Anfragen senden können - nur ob der Server dann noch stabil, läuft ist eine andere Sache ;):ROFLMAO:
 

bastla

mit bastla_Assi
Ich seh trotzdem noch schwarz für die arme Kiste, auf der das Script laufen muss, wenn so viele Pings auf ihr abgefeuert werden :D
 

Supernature

Und jetzt?
Teammitglied
Einen Ping pro Sekunde verkraftet sogar ein 386er ohne merklichen Performance-Einbruch, das sollte kein Problem sein.
Ich hätte da schon eher Angst, dass das Script irgendwann abstirbt und ich es erst eine Woche später merke - genau dann, wenn ich das Backup von Gestern dringend brauche und feststelle, dass es nicht da ist.
Sinnvoller wäre es in einem solchen Fall, die Aufgabenplanung von Windows zu verwenden, um das Script alle 24 Stunden starten zu lassen.
Dann muss ich z.B. auch nach einem Neustart nicht mehr daran denken.
 
Oben