YouTube-Logo
Aufschnur Logo

Batch: Backup-Script zur Verzeichnissynchronisation

Mit einem kleinen Batch-Script und dem windowseigenen Kopiertool Robocopy lässt sich ganz einfach eine Verzeichnissynchronisation ausführen. Ideal für ein Backup, z.B. zur Sicherung der eigenen Dateien auf eine externe Festplatte. Robocopy lässt sich umfassend durch Übergabeparameter steuern und eignet sich daher ideal für den automatisierten Einsatz per Batch-Script. Das Script kann manuell bei Bedarf ausgeführt werden oder automatisch per Aufgabenplanung (z.B. täglich, wöchentlich, bei jedem Herunterfahren des PC).

Vorbereitung

Bevor das Script einsatzfähig ist, müsst ihr das Quell- und Zielverzeichnis in die Scriptdatei eintragen: Bearbeitet die Datei per Rechtsklick → Bearbeiten. Tragt Quell- und Zielverzeichnis ein und speichert die Änderungen an der Datei. Beispiel 1:

SET quelle=C:\Users\maier\Documents
SET ziel=G:\Backup

Wichtig: Es wird kein abschließender Backslash \ angegeben. Außer man möchte ein komplettes Laufwerk kopieren (also z.B. D:\). Außerdem müssen Verzeichnisse die ein Leerzeichen enthalten mit Anführungsstriche umschlossen werden. Beispiel 2:

SET quelle=D:\
SET ziel="H:\Verzeichnis mit Leerzeichen"

Funktionsweise

Und so arbeitet das hier vorgestellte Script:

  1. Quell- und Zielverzeichnis werden auf Existenz geprüft. Bei einem Fehler bricht das Programm mit einer Fehlermeldung ab.
  2. Robocopy wird in einer gebräuchlichen Standardkonfiguration ausgeführt und synchronisiert das Ziel komplett mit der Quelle. Das Ziel wird also dabei in denselben Zustand wie die Quelle gebracht. Das heißt, neue Dateien werden kopiert, nicht mehr vorhandene Dateien in der Quelle werden auch im Ziel gelöscht, neuere Dateien in der Quelle überschreiben ältere Versionen im Ziel. Es werden auch leere Verzeichnisse kopiert. Zeitstempel und Dateiattribute der Dateien und Verzeichnisse werden übernommen, nicht jedoch Besitzer oder NTFS ACLs. Dadurch werden Probleme beim Wiederherstellen auf einem anderen PC oder nach einer Windows-Neuinstallation vermieden. (Wenn ihr lieber sämtliche Dateieigenschaften inklusive NTFS Sicherheitsflags kopieren möchtet, löscht einfach den Parameter /COPY:DAT). Lässt sich eine Dateioperation nicht ausführen, versucht es Robocopy bis zu drei Mal mit je 20 Sekunden Wartezeit dazwischen.
    ROBOCOPY %quelle% %ziel% /COPY:DAT /MIR /R:3 /W:20

    Das Verhalten lässt sich über die entsprechenden Parameter beeinflussen. Sollte eine einzelne Operation fehlschlagen, wird die Synchronisierung trotzdem zu Ende geführt und eine entsprechende Fehlermeldung ausgegeben.

Hinweise

  • Zusätzlich zur optischen Ausgabe werden Fehlermeldungen auch mit Zeitstempel in ein Logfile geschrieben, das im selben Ordner erstellt wird, in dem die Scriptdatei liegt.
  • Robocopy ist seit Windows Vista vorinstalliert. Sollte es tatsächlich noch Windows XP User geben: Unter Win XP müssen erst noch die Windows Server 2003 Resource Kit Tools installiert werden.

Download “FolderSync”

FolderSync-20160303.zip – 15932-mal heruntergeladen – 1,10 kB

Diese Beiträge könnten dich auch interessieren:

19 Kommentare

Mi
24. Oktober 2014 um 20:49 Uhr

Hallo

ich finde Ihre Batch Backup Script super ich habe aber das Problem dass ich eine Ganze Festplatte kopieren will also Quelle H:\ und Ziehl V:\ und das gibt ne fehlermeldung!
Können Sie mir da weiterhelfen?

Aufschnürer
21. November 2014 um 14:57 Uhr

Hallo und sorry für die verspätete Antwort. Wichtig ist, dass kein abschließender Backslash \ bei den Verzeichnissen angegeben wird. Außer man möchte die komplette Festplatte/Partition sichern (also z.B. D:\). Das Problem war aber noch etwas anderes. Die Verzeichnisvariablen waren bisher immer fest in Anführungszeichen umschlossen, das führt jedoch in manchen Fällen zu Fehlern. Deshalb habe ich das Script angepasst und Hinweise zu den Verzeichnisangaben hinzugefügt. Die neue Version steht zum Download bereit. Damit müsste jetzt auch H:\ und V:\ funktionieren.

Stefan
2. Januar 2016 um 17:07 Uhr

Hallo, leider funktioniert der Download-Link nicht mehr. Es kommt die Fehlermeldung
Diese Webseite ist nicht verfügbar.

ERR_CONNECTION_RESET

Aufschnürer
3. März 2016 um 9:31 Uhr

Hallo Stefan,
das war wohl ein vorübergehender Fehler. Bei mir funktioniert der Download von verschiedenen Computern/Standorten aus ohne Probleme.
Grüße

Zack117
2. März 2016 um 14:59 Uhr

Vielen Dank für den verständlichen Artikel und das Script.

Ich hätte da eine Frage zu deinen verwendeten Parametern, um genau zu sein „/s“, „/e“ und „/purge“

Weshalb hast du die in das Script inkludiert, wenn /mir so ziemlich macht. Und kollidiert /mir (bzw /e) nicht mit /s?

Aufschnürer
3. März 2016 um 10:08 Uhr

Danke für den Hinweis! Ich habe das Script jetzt korrigiert und /s /e /purge entfernt.

Trevor
10. Januar 2017 um 12:50 Uhr

Hi,
dein Artikel ist super, aber ich finde das er ein wenig irreführend ist.
Was du beschreibst ist leider keine synchronisation im klassischen Sinne, denn die bedarf eine two-way synchronisation.
Dein script ist dann doch eher ein Backup. (auch wenn es gespiegelt ist).

Trotzdem natuerlich Daumen hoch für den Artikel. Kannst dir sicher denken wie ich hierher gefunden habe. Daher auch die Anmerkung.

Mach weiter so,

LG

Aufschnürer
11. Januar 2017 um 11:09 Uhr

Hallo Trevor,
danke für dein Feedback! Bei der Definition kann man es natürlich aus verschiedenen Blickwinkeln betrachten. Eine Datensynchronisation muss aber nicht zwingend two-way sein. Wikipedia hat das schön zusammengefasst:

„Man unterscheidet unidirektionale Synchronisation, bei der die Daten eines Teilsystems bevorzugt behandelt werden, von bidirektionaler Synchronisation, bei der die Daten aller Teilsysteme gleichwertig sind.“

Dieses Backup-Skript entspricht der unidirektionale Synchronisation, auch wenn das im Endeffekt dann einer einfachen Spiegelung gleich kommt. Das Ziel wurde dann schlicht mit der Quelle synchronisiert.
Viele Grüße

Sebastian
5. Februar 2017 um 11:02 Uhr

Dein Skript ist bei einem Verzeichnis sehr gut geeignet, doch was ist wenn ich (vor allem bei einem Backup) mehrere Verzeichnisse sichern möchte? Gibt es eine elegante Möglichkeit dein Skript dahingehend zu erweitern oder muss ich tatsächlich für jedes Verzeichnis ein Batch-File anlegen?

Aufschnürer
8. Februar 2017 um 13:27 Uhr

Hallo Sebastian, danke für dein Feedback! Das Script ließe sich noch mit einer Schleife erweitern, mir fehlt momentan aber die Zeit dafür. Da ich bereits ein Backup-Script mit AutoIt geschrieben habe, welches diese Funktion bereits mitbringt, werde ich das wohl demnächst veröffentlichen.

Vincent Warte
25. Februar 2017 um 15:46 Uhr

Hallo,

vielen Dank für das Script. Ich habe aber eine kurze Frage zur Erweiterung des Scripts. Folgendes möchte ich tun:

Meine Quelle ist C:\Daten\Excel_Dateien\

Ich möchte diesen Ordner jede Nacht backupen, aber so, dass der ganze Ordner quasi auf das Backup-Medium kopiert wird, und dort quasi parallel mehrere Ordner „Excel_Dateien“ abgelegt werden, und zwar mit Datum im Ordnernamen.

Zielordner sollen also entsprechend des Backup-Datums so aussehen:

Backup vom 25.02.2017:
D:\Backup\Excel_Dateien_25_02_2017\

Backup vom 26.02.2017:
D:\Backup\Excel_Dateien_26_02_2017\

Backup vom 27.02.2017:
D:\Backup\Excel_Dateien_27_02_2017\

Und so weiter. Wie müsste das Script ergänzt werden, bzw. wie würde die finale Version dann aussehen?

Danach würde ich mit einem weiteren Script Ordner in D:\Backup\ die älter als 2 Wochen alt sind löschen lassen.

Ich freue mich auf eine Antwort.

MfG,
Vincent

Stefan
5. April 2017 um 22:26 Uhr

@ Vincent
Vielleicht kann ich dir da weiterhelfen, folgendes Script legt dir Ordner mit Datum für das Backup an.
Hatte einige Zeit in Anspruch genommen bis ich es so stehen hatte.

set SICHERUNGSORDNER=“C:\Users\***\Desktop\Ziel\%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%-Backup“
echo Erstelle Sicherungsverzeichnis %SICHERUNGSORDNER%
mkdir %SICHERUNGSORDNER%
robocopy „C:\Users\***\Desktop\Quelle“ %SICHERUNGSORDNER% /LOG+:“C:\Users\***\Desktop\Ziel\%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%.log“ /MIR /A-:HS /R:3 /W:2 /TEE

#/MIR Spiegelt eine Verzeichnisstruktur
#/A-:HS Hidden und System Attribut beim kopieren entfernt
#/R:3 Wiederholungen des Kopiervorgangs
#/W:3 Wartezeit zwischen den Kopiervorgängen
#/TEE Gibt Daten in das Konsolenfenster und die Protokolldatei aus.
#/LOG+:Datei Gibt den Status der Protokolldatei aus
—————————————————————————————————————

Und hier der Batch zum „Automatisiertem Löschen

robocopy.exe C:\Users\***\Desktop\Ziel C:\Users\***\Desktop\Löschen /E /MOVE /MINAGE:4 /R:1 /W:1
rmdir C:\Users\***\Desktop\Löschen /s /q

#C:\Users\***\Desktop\Ziel : Quellordner
#C:\Users\***\Desktop\Löschen : Zielordner
#/E : inklusive Unterverzeichnisse
#/MOVE : verschieben statt kopieren
#/MINAGE:8 : Mindestalter, Dateien die jünger als 4 Tage sind werden ignoriert
#/R:1 : Bei Fehler 1x noch mal versuchen
#/W:1 : zwischen Wiederholungen 1 Sekunde warten (bei Fehler)

#rmdir C:\Users\***\Desktop\Löschen /s /q : Verzeichnis C:\Users\***\Desktop\Löschen inklusive Unterverzeichnissen ohne Nachfrage löschen

Mit besten Grüßen

Stefan

Mirko Czerwik
15. April 2017 um 17:02 Uhr

Hier mal eine andere Variante welcher Deiner Vorstellung enstpricht:

:: written by Mirko Czerwik (mcadmin.de)
::
:: *****************************************************************
set QuellVerzeichnis=“C:\Daten\Excel_Dateien\“
set BackupVerzeichnis=“D:\Backup\“
set Tage=5
:: *****************************************************************

echo QuellVerzeichnis auf %QuellVerzeichnis% gesetzt
echo BackupVerzeichnis auf %BackupVerzeichnis% gesetzt
echo.

echo Lese alle Backupverzeichnisse
dir %BackupVerzeichnis% /AD /C /ON /B /S
echo.
echo Suche nach Backup Dateien und Verzeichnissen welche aelter als %Tage% Tage sind.
Forfiles /P %BackupVerzeichnis% /S /M *.* /D -%Tage% /C „cmd /c del /q @path“
FOR /F „tokens=* delims=“ %%i in (‚dir /AD /B /S %BackupVerzeichnis% ^| sort /R‘ ) do (
RD „%%i“ 2>nul && echo DELETE %%i
)
echo.

:: * Aktuelle Zeit holen und Doppelpunkte durch Punkte ersetzen *
set CURRENTTIME=%TIME::=.%

:: Stunden aus Zeit holen und Null hinzufügen wenn vor 10 Uhr
set ZEIT=%time%
set STUNDE=%ZEIT:~0,2%
if „%STUNDE:~0,1%“==“ “ set STUNDE=0%STUNDE:~1,1%

:: * Stunden der Zeit hinzufügen und restlichen Zeichen der Zeit anfuegen: .MM.SS *
set CURRENTTIME=%STUNDE%%CURRENTTIME:~2,3%
echo Hole aktuelle Zeit: %TIME:~0,5% Uhr
:: * ARCHIVPFAD zusammensetzen *
set ARCHIVPFAD=Excel_Dateien_%DATE%-%CURRENTTIME%
echo Setze den Archivpfad auf %ARCHIVPFAD%
echo.

xcopy %QuellVerzeichnis% %BackupVerzeichnis%\%ARCHIVPFAD%\ /C /F /R /Y /V

Mirko Czerwik
15. April 2017 um 17:19 Uhr

Korrigiere die letzte zeile noch

xcopy %QuellVerzeichnis% %BackupVerzeichnis%\%ARCHIVPFAD%\ /E /C /Q /I /F /R /Y /V

so bekommst Du auch die Unterordner mit im Quellpfad allerdings mit die Quelle mit einem
Backslash abschließen z.B.: „Z:\“

Susanne
30. Mai 2017 um 14:10 Uhr

„Das Ziel wird also dabei in denselben Zustand wie die Quelle gebracht. Das heißt, neue Dateien werden kopiert, nicht mehr vorhandene Dateien in der Quelle werden auch im Ziel gelöscht, neuere Dateien in der Quelle überschreiben ältere Versionen im Ziel. Es werden auch leere Verzeichnisse kopiert.“

Wird so das Ziel tatsächlich in den selben (eher: gleichen) Zustand wie die Quelle gebracht? Ich denke nicht, denn sonst müsste es schlicht heißen: „Alle Dateien werden so kopiert, dass sie sowohl vom Inhalt ALS AUCH vom Datum der Quelle entsprechen. Und nicht eingeschränkt „neuere Dateien in der Quelle überschreiben ältere Versionen im Ziel“ – Letzteres entspricht nun wirklich nicht dem gleichen Zustand…

Was müsste man also genau machen, um das Ziel inhalts- UND AUCH datumsmäßig tatsächlich 1:1 abzugleichen?

Fabio
27. Juni 2017 um 22:09 Uhr

Hallo zusammen

Dank google bin ich auf die interessante Seite gestossen. Leider bin ich nicht wirklich bewandelt im scripten aber ev.kann mir ja jemand helfen oder schon mal nur sagen ob mein „Wunsch“ überhaupt möglich ist:

Folgender Sachverhalt:

Migration File Server, 800 Shares aktuell auf einem dedizierten Server, werden umgezogen auf einen Filecluster resp. 2 mit 3 Partitionen.

Leider musste ich in einem ersten Schritt 800 Shares von Hand erstellen (auf den verschiedenen Clustern). Nun möchte ich Step by Step die Daten kopieren. Leider ist die Struktur so undurchsichtig, dass ich Robocopy nicht sagen kann, nimm Share A1 bis A100 und kopiere es nach B1 (A100 und B1 sind nur Annahmen)

Ich würde gerne das Script iwie mit der Excel Liste verknüpfen die ich habe mit den Shares wo ich sehe welches Share auf welche Partition und welchen Cluster kommt.

Kann ich das mit Robocopy irgendwie automatisieren? Es sind total 8 TB Daten 🙂

Gruss und Danke für eure Hilfe, wenn ich mich unklar ausgedrückt haben sollte, oder zuwenig detailliert, nur melden, es ist etwas schwierig mein Anliegen in Worten auszudrücken 🙂

Arne
8. November 2017 um 9:30 Uhr

Hallo Fabio,

falls Du es nicht schon gelöst hast (ist ja schon ein Weile her): Du könntest Dir in Excel mit VBA für jeden Kopiervorgang eine Batch Datei erzeugen lassen. Diese rufst Du dann aus einer Master-Batch-Datei auf (dann mit 800 Aufrufen).

So in etwa (Skript nicht getestet!):

Option Explicit
Sub CopyShares()
dim i as integer
Open „c:\master.bat“ For Output As #2
for i = 1 to 800
Open „c:\Share“ & format(i,“000″) & „.bat“ For Output As #1
print #1 „set quelle=“““ & Range(„A“ & i).Value & „“““
print #1 „set ziel=“““ & Range(„B“ & i).Value & „“““
Print #1 „ROBOCOPY %quelle% %ziel% /COPY:DAT /MIR /R:3 /W:20“
print #2 „Share“ & format(i,“000″) & „.bat“
Close #1
next i
Close #2
End Sub

Hein
13. August 2023 um 12:14 Uhr

Hallo,

ich habe eine Frage zu dem vorgehen, ob das jetzt unter Win10 noch der Fall ist – vermute aber einmal ja.

Voraussetzung:
K:\ = Netzlaufwerk und verweist auf \\MyBackup***\Dateien\FürUSBStick
O:\ = USBStick O:\Dateien\VonBackup

Wenn ich mit PS folgen den Script mit dem Befehl:
ROBOCOPY K:\ O:\Dateien\VonBackup/COPY:DAT /MIR /R:3 /W:20

ausführe, kopiert er mir die Dateien.

Wenn ich aber den Script wie oben beschrieben mit:
ROBOCOPY %quelle% %ziel% /COPY:DAT /MIR /R:3 /W:20
SET quelle=K:\
SET ziel=O:\Dateien\VonBackup

wird auf dem Stick kein Dateien kopiert.

Wo habe ich hier meinen Denkfehler?

Mein Vorhaben ist, einen Script zu erstellen, welcher die Daten von K:\ -> O:\ immer dann automatisch verschiebt, wenn Änderungen auf K:\ abgelegt wurden.

BG

Hein

Aufschnürer
13. August 2023 um 12:24 Uhr

Hallo Hein,
falls du in deiner Skriptdatei die Reihenfolge der Befehle genauso geschrieben hast, wie hier in deinem Kommentar, wird das die Ursache sein. Wichtig ist natürlich die Reihenfolge der Befehle. Also erst die beiden SET=… und dann erst den Robocopy-Befehl, sonst kann Robocopy mit „quelle“ und „ziel“ nichts anfangen.
BG, Björn



Deine Meinung zählt