Skript erstellen für regelmäßiges Backup

Seppl0815

Newbie
Registriert
März 2018
Beiträge
6
Hallo zusammen,

Ich hänge im Moment ein wenig fest, was das Erstellen eines Skriptes (Batch-Datei) angeht. Ich benötige von einem Ordner (z.B.: C.\Programme\Test) ein Backup nach jedem Start des Rechners. Das ganze aber nur für die letzten drei Tage. Der Zielordner soll wie folgt erstellt werden: C:\Programme\1 (für den ersten Tag, C:\Programme\2 für den zweiten Tag, usw.). Dabei sollen aber zwei Ordner ignoriert werden (C:\Programme\Test\log, C:\Programme\Test\egal)

Folgendermaßen soll das ablaufen:

Der Rechner wird gestartet und es wird das Backup für den heutigen Tag unter C:\Programme\1 erstellt. Anschließend soll dem Skript irgendwie verdeutlicht werden, dass das Backup für den aktuellen Tag schon gemacht wurde, damit das nicht nach jedem neustart des Rechners an diesem Tag erneut ein Backup gemacht wird.

Wenn die ersten drei Tage nun vorbei sind und auf der Platte die Ordner C:\Programme\1, 2 und 3 voll sind, soll wieder von vorne angefangen werden und der Ordner 1 darf überschrieben werden. Denn ich möchte vermeiden, dass sich unnötig viele Ordner erstellen.
Es geht auch, dass der Ordner den Namen des aktuellen Tages bekommt dann aber nach vier Tagen wieder gelöscht wird um die Festplatte nicht volllaufen zu lassen.

Ich hoffe, dass ich das verständlich erklären konnte.

Danke schon mal für eure Hilfe.
 
Hi,

- warum ein Skript und nicht fertige Software, die so etwas kann?
- warum eine Sicherung innerhalb des Rechners? "Sicher" ist damit dann absolut nichts - das ist dir bewusst?

VG,
Mad
 
Stichworte: Robocopy und Windows Aufgabenplaner. Schwierig wird das mit den drei Tagen, weil sich der Aufgabenplaner an täglich/wöchentlich/monatlich orientiert..
 
Das Backup innerhalb des Rechners hat einen Grund, den es im Moment nicht so schnell zu ändern geht. Hat also seinen Grund.

Skript deswegen, da ich nicht auf allen Rechner eine Software installieren kann/möchte.
 
Robocopy + Autostart.
Dazu eine Datei anlegen und bei jedem Run des Scripts das Datum reinschreiben. Damit kannst du beim Start des Skripts immer nachgucken, wann zuletzt das Backup war, und abbrechen, wenn es der gleiche Tag ist.

Das Backup unter C:/Programme zu speichern ist aber die dümmste Methode die du machen kannst. Kannst du nicht wenigstens auf eine zweite Partition ausweichen?

Ansonsten gilt, wie schon gesagt, ein Backup auf dem gleichen System ist kein Backup. Egal was für ein Grund dagegen spricht, der muss schnellstmöglich beseitigt werden.
 
Er könnte auch einfach direkt im Skript das aktuelle Datum nehmen und bei den Backups das Datum reinschreiben. Dann kannst einfach am Ende alles löschen was älter als 3 Tage ist anhand des Datums.
 
Autokiller677 schrieb:
Ansonsten gilt, wie schon gesagt, ein Backup auf dem gleichen System ist kein Backup. Egal was für ein Grund dagegen spricht, der muss schnellstmöglich beseitigt werden.

Warum? Vielleicht macht er es ja so wie ich. Ich speichere das Backup auch immer auf die 2te Platte im System und verschiebe es anschließend auf mein NAS. Ist einfach deutlich schneller, als direkt auf das NAS zu speichern.
Was soll da passieren ?! Im Fall der Fälle ist ja trotzdem noch das vorangegangene Backup (welches sich ja schon auf der NAS befindet) vorhanden !
 
Zuletzt bearbeitet:
Hi,

@Raul74

du gibst dir die Antwort doch schon selbst: deine Sicherung verbleibt nicht an dieser Stelle. Ergo ist die interne Datei nicht das Backup, sondern das auf der NAS. Hier ist davon auszugehen, dass es intern verbleibt. Der TE schreibt ja selbst

Das Backup innerhalb des Rechners hat einen Grund

und das ist schlicht kein Backup. Wird das Ganze nochmal wohin kopiert: ganz was anderes. Scheint hier aber nicht der Fall zu sein. Ergo ist der Einwand mehr als nur gerechtfertigt.

VG,
Mad
 
Die Pfade waren ja erstmal nur reine Beispiele. Natürlich kann ich das ganze auch auf einen externen USB Stick kopieren. Mir geht es nur darum, dass ich probleme habe mit dem täglichen (oder vielleicht sogar nur wöchentlichen) backupturnus. Denn ich bin da nicht so ganz fit drin, wie ich es schreiben soll, damit er nach X-Tagen wieder die alten löscht (wenn mit Datum gearbeitet wird) oder wieder den Inhalt im Ordner 1 (wenn man mit Numerierung arbeitet) überschreibt.
 
Hi,

im Grunde kannst du sagen:

- prüfe ob Ordner "1" vorhanden, wenn ja: lösche
- Benenne "2" nach "1", "3" nach "2"
- Erstelle Ordner "3" für heute

VG,
Mad
 
Ich habe hier mal mein ersten Versuch gewagt. Die Pfade sind nur Beispiel. Aber so richtig will er das ganze noch nicht kopieren wollen. Die Ordner 1, 2 und 3 werden aber erstellt.
Habt ihr da ne Idee?!

REM ... *********** ---> start backup *********

set QUELLDIR=%CD%
set DATE_AKTU=%date%

rem Verzeichnisse und exclude Datei anlegen
cd E:\backup
if not exist backup mkdir backup
cd backup

echo \defaults\ >> exclude.txt

if not exist 1 mkdir 1
if not exist 2 mkdir 2
if not exist 3 mkdir 3
cd 1

rem Test, ob heute schon ein Backup lief
rem (wenn Datei mit Namen %DATE_AKTU% vorhanden, dann kein Backup)
set STATUS_BACKUP=0
if exist "%DATE_AKTU%" set STATUS_BACKUP=1
if not exist "%DATE_AKTU%" set STATUS_BACKUP=0

if "%STATUS_BACKUP%"=="0" (
cd ..
rmdir 3 /s /q
move 2 3
move 1 2
mkdir 1
cd 1
echo %date% > %date%
echo %QUELLDIR% >> %date%
rem ins Release-Verzeichnis wechseln:
cd "%QUELLDIR%"
xcopy "%QUELLDIR%" "E:\backup\1" /q /E /c /I /Y /EXCLUDE:E:\backup\exclude.txt
xcopy "C:\Program Files (x86)\Audacity" "E:\backup\1" /q /Y
echo Backup fertig ) else (
echo Backup von heute breits vorhanden )

cd "%QUELLDIR%"

REM ... *********** end backup <---- *********
 
Raul74 schrieb:
Warum? Vielleicht macht er es ja so wie ich. Ich speichere das Backup auch immer auf die 2te Platte im System und verschiebe es anschließend auf mein NAS. Ist einfach deutlich schneller, als direkt auf das NAS zu speichern.
Was soll da passieren ?! Im Fall der Fälle ist ja trotzdem noch das vorangegangene Backup (welches sich ja schon auf der NAS befindet) vorhanden !

Da passiert schonmal weniger als direkt auf dem Rechner, aber davon, dass die Daten den PC verlassen war hier nie die Rede.

Zu deiner Strategie: Solang das NAS immer am angeschlossen ist + der PC Schreibrechte auf dem Backup Verzeichnis hat, ist das auch nur die halbe Miete. Blitzeinschlag oder ein Virus können hier sowohl Original als auch Backup zerstören.

Für wichtige Daten sollte immer ein Offline-Backup vorhanden sein, zu jeder Zeit. Idealerweise an einem anderen Ort (Schutz vor Feuer etc.).
 
Seppl0815 schrieb:
if "%STATUS_BACKUP%"=="0" (
cd ..
rmdir 3 /s /q
move 2 3
move 1 2

move würde ich nicht nehmen, eher ren. move ist verschieben, ren umbenennen.
Die Verzeichnisse musst du im Grunde nicht jedes mal anlegen, die werden automatisch beim Umbenennen/ Kopieren erstellt.
Ob der XCOPY-Befehl stimmt kann ich nicht beurteilen, ich nehm immer ROBOCOPY, damit sähe der Befehl z.B. so aus

robocopy "%QUELLDIR%" "E:\backup\1" /copy:*DAT /R:1 /W:1 /E /XD "C:\Programme\Test\log" "C:\Programme\Test\egal"

/XD definiert hier die ausnahmen, die exclude.txt fällt also weg. Du kannst mehrere Pfade in Anführungszeichen dahinter schreiben.

Zum Thema warum dein Skript nicht geht, wärs mal interessant, was die CMD ausgibt, also mal ECHO an lassen, am Ende eine PAUSE einfügen und das Ergebnis Posten.

PS: * der macht aus meinem : und D einen Smily... was ein schmarn, zwischem dem : und D sollte KEIN "*" im echten befehl sein!
 
Zuletzt bearbeitet:
Autokiller677 schrieb:
Das Problem mit : und D sollte in einer Code Umgebung nicht auftreten.

Danke für den Tipp!

Ich hab mir mal die Freiheit genommen das Skript mit neu zu schreiben, wie ich das angehen würde, läuft bei mir wie gewünscht

Code:
REM ... *********** ---> start backup *********

REM Quelle und Ziel festlegen
set QUELLDIR=%CD%
set ZIELDIR=E:\backup

REM definiert die Variable %datum%, falls das Backup noch nie gelaufen ist, wird ein Dummy-Wert in die Variable geschrieben
if exist %ZIELDIR%\datum.txt (
    set /p datum=<%ZIELDIR%\datum.txt
) else (
set datum=neu
)

REM prüft, ob heute schon ein Backup geschrieben wurde
if %date% == %datum% (
echo Backup von heute breits vorhanden.
REM ***nachfolgende pause entfernen um CMD direkt schliessen zu lassen***
pause
REM wurde das Backup schon geschrieben wird das Skript beendet mit exit
exit)

REM falls kein Backup geschrieben wurde wird der Rest ausgeführt
REM 3 löschen, die anderen Ordner umbenennen
rmdir %ZIELDIR%\3 /s /q
ren %ZIELDIR%\2 3
ren %ZIELDIR%\1 2

REM die Kopiervorgänge mit ROBOCOPY analog zu deinen 
robocopy "%QUELLDIR%" "%ZIELDIR%\1" /copy:DAT /R:1 /W:1 /E /XD "%QUELLDIR%/defaults"
robocopy "C:\Program Files (x86)\Audacity" "%ZIELDIR%\1" /copy:DAT /R:1 /W:1

REM das heutige Datum wird in die datum.txt geschrieben für die nächste Ausführung
echo %date%>%ZIELDIR%\datum.txt

echo Backup erfolgreich!
REM ***nachfolgende pause entfernen um CMD direkt schliessen zu lassen***
pause
exit

REM ... *********** end backup <---- *********

Wie bei deiner Vorlage, wird von Audacity nur der Hauptordner gesichert und keine Unterordner, sollen auch die Unterordner gesichert werden muss es so aussehen:
Code:
robocopy "C:\Program Files (x86)\Audacity" "%ZIELDIR%\1" /copy:DAT /R:1 /W:1 /E
 
Zuletzt bearbeitet:
Schick!

Als allgemeine Anmerkung noch für den Fragesteller: Jeden Tag den ganzen Ordner neu zu kopieren ist sehr ineffizient, vor allem wenn der Ordner groß ist. Daher sollte auf Dauer über eine Backuplösung nachgedacht werden, die nur die wirklich neuen / veränderten Dateien kopiert und nicht jedes Mal alles.

Dazu sollte noch Fehlerbehandlung eingefügt werden, damit es eine Meldung gibt wenn irgendwas schief geht. Nichts ist schlimmer als ein Backup, das nicht vollständig / aktuell ist wegen einem kleinen dummen Fehler irgendwo.
 
Das Problem läßt sich in 2 Schritten angehen:
1. Backup-Ordner rotieren, so daß Backup #3 -> Backup #1, Backup #2 -> Backup #3, Backup #2 -> Backup #3 wird
2. Robocopy immer inkrementell auf Backup #1 anwenden

Idealerweise nutzt man aber rsync und nutzt harte links. Beim Backup-Vorgang von der Quelle nach Backup #1 immer Backup #2 als Referenz angeben, dann werden Daten nicht doppelt gesichert und alle Backups sehen aus wie Vollbackups...
 
@mineRaptor

Vielen lieben Dank für deine hilfreiche Unterstützung. Das hat mir super weitergeholfen. DANKE dafür!!

DANKE auch an alle anderen, für eure Anregungen.
 
Ich kann mich Autokiller677 nur nochmal anschließen. So viel Mühe mineRaptor sich auch gegeben hat, es bleibt aus zwei Gründen ineffizient:
Altes Backup löschen kostet Zeit
Jedes Mal ein Vollbackup kostet Zeit
Das mag bei kleinen Sicherungs-Jobs verschmerzbar sein, bei der täglichen Sicherung von vielleicht Gigabyteweise Daten mit nur wenig Änderung ist das nicht mehr vertretbar.

Folgendes Skript erstellt unter C:\Backup vier Ordner
backup.0
backup.1
backup.2
backup.3 (Dummy Ordner, immer leer, für Rotation benötigt)

Robocopy muß nach dem Skript einfach nur immer mit dem Ziel backup.0 ausgeführt werden

Code:
verify other 2>nul
setlocal EnableExtensions
IF errorlevel 1 echo Unable to enable extensions & pause & GOTO:EOF

SET MaxBackupNr=3
SET DstPath=C:\Backup

SET /p =move...<nul
REM Erstellt alle Backup-Ordner, eigentlich nur beim ersten Durchlauf nötig, macht aber nichts kaputt
FOR /L %%A IN (0,1,%MaxBackupNr%) DO (md "%DstPath%\backup.%%A" 2>NUL)
setlocal EnableDelayedExpansion
FOR /L %%A IN (%MaxBackupNr%,-1,1) DO (SET /A B=%%A-1 & move "%DstPath%\backup.!B!" "%DstPath%\backup.%%A" >NUL 2>&1 & (IF errorlevel 1 echo move error & pause))
endlocal
move "%DstPath%\backup.%MaxBackupNr%" "%DstPath%\backup.0" >NUL 2>&1
IF errorlevel 1 echo move error & pause
IF errorlevel 0 SET /p =backup rotation done: <nul& echo %time:~0,8% & echo.
 
Zurück
Oben