PCNotfallhilfe

Tipps und Hilfe aus der IT-Welt von A wie Android bis Z wie Zuse

Windows ROBOCOPY besser als copy und xcopy für Backups und Synchronisationen

| 44 Kommentare

Hi,

heute möchte ich euch etwas vorstellen, dass eigentlich nicht NEU aber trotzdem nicht allzu bekannt ist. Die Möglichkeit mit Windows Bordmitteln ein Backup/Synchronisation eurer Dateien zu machen.

Das Zauberwort (oder-Befehl) lautet ROBOCOPY.

Wer schon mit copy und xcopy gearbeitet hat, kennt bestimmt einige Parameter, die man anhängen kann, um das kopieren von Dateien steuern zu können. Robocopy bringt einiges mehr mit. Wer sich schon mal vorab ein Bild machen will, ruft sich eine Windows-Konsole auf (Start –> cmd –> Enter) und gibt ein: robocopy /?

Als erstes wird die grundlegende Syntax (der Befehlsaufbau) angezeigt und nachfolgend eine Menge von zusätzlichen und sehr nützlichen Parametern unterteilt in mehreren Options-Abschnitten.

Kopier-Optionen

Dateiauswahl-Optionen

Anführungsstriche

Wiederholung-Optionen

Protokoll-Optionen

Job-Optionen

Hier ist jeder selbst gefragt, sich das Beste rauszusuchen. Was ich Euch zeigen möchte, sind einige Anwendungsbeispiele und welche Parameter man am besten setzt.

Fangen wir mal grundsätzlich an und nach und nach werden wir dann spezieller.

Kurzer Hinweis, bevor es gleich los geht.
Wenn ihr aus diesem Artikel Teile von ROBOCOPY Befehlsparametern und andere Teile aus den Beispielen der BATCH kopiert, dann bitte unbedingt darauf achten, dass die Anführungsstriche nach dem Einfügen bei Euch durch „Eure“ eigenen neu gesetzt, also ersetzt werden.

Beispiel:
Wenn ihr den folgenden, in Anführungsstriche gesetzten Satz, von hier kopiert und bei Euch (meist in einem Texteditor) einfügt dann werden diese 1:1 übernommen.

„Satz in Anführungsstriche“

Das heisst am Anfang des Wortes unten und am Ende oben. Wenn ihr in eurem Editor Anführungsstriche nutzt, dann sind diese am Anfang- und Ende beide oben.

Anführungsstriche

Eure Batch funktioniert aber nur mit den im Editor gesetzten Anführungsstrichen !!!!!

  • Ein Grundsatz ist, das Groß-/Kleinschreibung ignoriert wird. Ihr könnt robocopy oder ROBOCOPY schreiben und auch die Parameter können /s oder /S geschrieben werden. Eine Unterscheidung dient nur der besseren Lesbarkeit aber seht selbst
  • Befehlssatz: ROBOCOPY Quelle Ziel [Datei [Datei]…] [options] –> (die eckigen Klammern zeigen nur an, dass dieses optional also nicht zwingend angegeben werden muss)
    • Quelle / Ziel :: entweder ein Laufwerk mit Buchstaben –> C:wo-auch-immer oder ein Netzwerkpfad –> wo-auch-immer-im-netz
    • Datei :: Die Datei selber –> textdatei.txt
    • Beispiel: c:temp c:aprobo-backup hotfix.txt
    • Bedeutet, ich möchte aus dem Ordner c:temp in den Ordner c:aprobo-backup die Datei hotfix.txt kopieren.

Was man beim ROBOCOPY Output sieht ist, dass es Standardeinstellungen seitens ROBOCOPY gibt. Ich hatte im obigen Beispiel keine Parameter (options) angegeben aber in dem Ausgabebericht kann man sehen, welche Optionen gesetzt sind.

robocopy

  • /COPY:DAT
  • /R:1000000
  • /W:30

/COPY:DAT

D = Data (Inhalt der Datei)
A = Attributes
T = Timestamps

Es gibt für den Parameter /COPY noch weitere „Schalter“

S = Security = NTFS Zugriffsrechte
O = Owner
U = aUditing (Überwachungsoptionen werden mit kopiert)

Der komplette Befehl für /COPY mit allen Schaltern würde /COPY:DATSOU lauten, man kann auch /COPYALL schreiben.

/R:1000000

Standardmäßig versucht ROBOCOPY 1 millionenmal, eine Datei zu kopieren, sollten Probleme (offene Dateien) auftreten.

/W:30

Standardmäßig versucht ROBOCOPY 30 Sekunden lang eine Datei zu kopieren, sollten Probleme (offene Dateien) auftreten.

Das bedeutet, dass ROBOCOPY 30 Millionen Sekunden = 500.000 Minuten = 8333,33 Stunden = 347,22 Tage lang versuchen würde eine Datei zu kopieren.

*******************************************

Anwendungsbeispiele (reine Kopier-Beispiele —-> die Report- Anzeige- und sonstigen „Begleit“-Einstellungen erwähne ich weiter unten):

  • Spiegelung oder 1:1 Kopie mit –> /E /PURGE oder –> /MIR
    • Beispiel 1:
      • robocopy C:quelle Z:ziel /E /PURGE /R:1 /W:1
        • /E kopiert alle Quell-Dateien ins Zielverzeichnis samt Unterverzeichnissen (Ordner), auch leere Ordner
        • /PURGE löscht ALLE Dateien im Zielverzeichnis, die NICHT (mehr) im Quellverzeichnis vorkommen
        • /R:1 /W:1 es wird 1 Mal und 1 Sekunde lang probiert zu kopieren, bei Problemen (offene Dateien)
    • Beispiel 2:
      • robocopy C:quelle Z:ziel /MIR /R:1 /W:1
        • /MIR ersetzt /E und /PUR –>/MIR kopiert alle neuen und geänderten Dateien und löscht alle Dateien im Ziel, die in der Quelle nicht vorkommen.
        • /R:1 und /W:1 wie oben beschrieben
  • Inkrementelle Sicherung mit Parameter –>/M
    • /E kopiert alle Quell-Dateien ins Zielverzeichnis samt Unterverzeichnissen (Ordner), auch leere Ordner
    • /M kopiert nur Dateien mit gesetztem Archiv-bit und setzt das Archiv-bit nach dem Kopieren wieder zurück
    • Beispiel: C:quelle Z:ziel /E /M /R:1 /W:1robocopy_2
    • Ich habe in meinem Bildbeispiel den Schalter /S verwendet um auch gleichzeitig zu demonstrieren, dass hierbei der leere Ordner (als „leerer ordner“ beziffert) nicht mit kopiert wirdrobocopy_1
  • Schön zu sehen hier, wie das Archiv-bit -a vom Quellverzeichnis entfernt wird (gelbe Markierung)
    **********************************

    Differentielle
    Sicherung mit Parameter –>/A

    • /E kopiert alle Quell-Dateien ins Zielverzeichnis samt Unterverzeichnissen (Ordner), auch leere Ordner
    • /A kopiert nur Dateien mit gesetztem Archiv-bit aber ändert das Archiv-bit nach dem Kopieren NICHT
    • Beispiel: robocopy C:quelle Z:ziel /E /A /R:1 /W:1

klick) Am Ende des Artikels wird der grundsätzliche Unterschied zwischen inkrementellem und differentiellem Backup erläutert

  • Beispiel einer Sicherung (1:1 Kopie) des Benutzerprofiles (USERPROFILE)
    • robocopy %userprofile% z:ziel%username% /B /MIR /R:1 /W:1
    • Erklärung:
      • %userprofile% –> Man kann als Quelle auch Systemvariablen nehmen, um variabel zu bleiben (Entspricht unter Win7 –> C:Benutzer[Benutzername])
      • %username% –> Damit man im Ziel auch den gleichen Benutzernamen als Ordnername hat….
      • /B –> Backup Mode (das erlaubt ROBOCOPY die in der NTFS ACL hinterlegten Rechte zu überschreiben, wenn notwendig. Benötigt Adminrechte)
      • /MIR –> die „Spiegelvariante“. Löscht im Ziel alles was nicht in der Quelle vorhanden ist. Hier könnte man auch die Schalter /A oder /M nehmen wie oben beschrieben.
      • /R:1 und /W:1 –> einen Versuch bei einer Sekunde Verzögerung, kann auch so eingestellt werden/R:0 und /W:0

Jetzt wird es Zeit, ein paar Schritte weiter zu gehen und etwas variabler zu werden. Zum einen werden wir uns „Batchdateien“ anlegen und zum anderen werden wir innerhalb dieser Batchdateien „variabel“ werden.

  1. wir legen uns eine Datei an mit Namen rc-backup.bat
  2. wir öffnen diese Datei mit einem Editor
  3. wir tragen einen der oben genannten robocopy Befehle ein, z.B. zur Sicherung des Benutzerprofiles, also: robocopy %userprofile% z:ziel%username% /B /MIR /R:1 /W:1
  4. wir speichern die Datei und führen sie anschließend mit einem Doppelklick aus

Was passiert? Wer wenig Dateien/Ordner zu kopieren hat, bei dem flackert kurz ein dunkler Bildschirm auf und verschwindet wieder. Wer ein größeres Profil zu sichern hat, bei dem bleibt die Konsole länger stehen, diese verschwindet dann wieder, sobald robocopy seinen Dienst verrichtet hat. Was wurde nun gesichert? Wurde überhaupt gesichert? Um hier Klarheit zu haben, kann man sich alles was robocopy im Hintergrund tut, protokollieren lassen. Genau, mit einem weiteren Parameter.

Die 3 wesentlichen seien hier aufgeführt:

  • /LOG:file –> Beispiel: robocopy %userprofile% z:ziel%username% /B /MIR /R:1 /W:1 /LOG:C:protokoll-ordnerprotokoll.txt
  • /LOG+:file –> Das gleiche wie eins höher, nur hier werden mit dem + Zeichen alle folgenden Protokolle angehängt, in der obigen Variante werden ältere überschrieben
  • /L –> das ist ein ganz interessanter Schalter auf den ich im Einzelnen noch zurückkommen werde. Soviel vorab: Ist dieser gesetzt wird NICHTS kopiert, sondern nur protokolliert, quasi als Kontrolle, was wären wenn…….

Sobald einer der beiden Parameter /LOG (mit oder ohne +) gesetzt wurde, werden alle Kopiervorgänge in diese protokoll.txt geschrieben…..aber nichts mehr am Bildschirm ausgegeben. Wer trotzdem auch am Bildschirm mit verfolgen will, was robocopy treibt, kann das mit dem Parameter /TEE realisieren und wer sich nur die „wesentlichen“ Ausgaben, ohne z.B. Ordnerliste, Dateiliste, Kopierfortschritt (prozentualer Kopierfortschritt) anschauen will, sollte die Schalter /NDL /NFL /NP  hinzufügen. Jetzt werden nur noch der Job-Header, die „echten“ Fehlermeldungen (ERROR 32 (33) = Datei (oder Teile) in Benutzung durch anderen Prozess / Error 5 = Access is denied oder *Extra File (alle NEUEN Dateien im Ziel) und die Job-Summary in der Konsole angezeigt und in die protokoll.txt eingetragen.

Damit sieht unser Befehl in unserer Batchdatei folgendermaßen aus:

robocopy %userprofile% z:ziel%username% /B /MIR /R:1 /W:1 /TEE /NDL /NFL /NP  /LOG+:C:protokoll-ordnerprotokoll.txt

Damit kann man erst einmal die wichtigsten Backups anlegen, indem man nur die Quell und Zielordner austauscht und alle anderen Parameter beibehält.

ABER ACHTUNG:
Man muss sich mit den Parametern /MIR und der Kombination /E + /PURGE im Klaren sein, dass hier gespiegelt wird, also Dateien/Ordner im Ziel gelöscht werden, die in der Quelle nicht (mehr) vorhanden sind. Wer will kann die beiden Parameter durch /E oder /S mit den oben erwähnten /A und /M ersetzen und somit zwei unterschiedliche Arten von Batchdateien erzeugen. Eine nur für Spiegelungen (/MIR) und eine für reine Kopien, ohne das im Zielverzeichnis gelöscht wird

Nun einen kleinen Schlenker weg von robocopy und hinein in die Batchdatei, denn so eine Protokolldatei kann schon sehr groß und unübersichtlich werden, im Laufe der Zeit. Daher tragen wir in der Batch etwas ein, das uns immer eine Protokolldatei pro Tag erstellt und damit die Anzahl der Dateien nicht überhand nehmen, löschen wir alle Protokolldateien, die älter sind als 7 Tage.

Im Moment sieht unsere Batch so aus:

robocopy %userprofile% z:ziel%username% /B /MIR /R:1 /W:1 /TEE /NDL /NFL /NP  /LOG+:C:protokoll-ordnerprotokoll.txt

Wir tragen über diesem Befehl folgendes in die Batch ein:

SET _DATUM=%date:~-4,4%-%date:~-7,2%-%date:~-10,2%

und ändern unseren robocopy Befehl folgendermaßen ab:

robocopy %userprofile% z:ziel%username% /B /MIR /R:1 /W:1 /TEE /NDL /NFL /NP  /LOG+:C:protokoll-ordnerprotokoll-%_DATUM%.txt

Zur Erklärung:

Mit dem Befehl SET erzeugen wir eine Variable, mit dem Namen, der auf SET folgt, hier _DATUM.
Der Unterstrich sorgt nur dafür, das ich mit keiner Systemvariablen vom Namen her kollidiere. Dieser Variable _DATUM könnte man auch einfach das Tagesdatum (date) zuordnen, aber dann würde die Protokolldatei z.B. protokoll-08.10.2014.txt heißen. Zur besseren Sortierung (nicht nach dem Tag sondern Jahr-Monat-Tag (YYYY-MM-DD)) zerlegen wir den Inhalt von date.

  • %date% –> der Inhalt von date = 08.10.2014
    • %date:~-4,4% –> gehe von rechts 4 Stellen und gib mir 4 Zeichen nach rechts aus = 2014
    • %date:~-7,2% –> gehe von rechts 7 Stellen und gib mir 2 Zeichen nach rechts aus = 10
    • %date:~-10,2% –> gehe von rechts 10 Stellen und gib mir 2 Zeichen nach rechts aus = 08
    • _DATUM wird dann zusammengesetzt und jede „Einheit“ mit einem Bindestrich (in rot) verbunden –>%date:~-4,4%%date:~-7,2%%date:~-10,2%
    • die Ausgabe einer Variablen wird mit Prozentzeichen (%variable%) maskiert

Jetzt fehlt nur noch der Eintrag am Ende, der dafür sorgt, dass alle txt Dateien dieses Protokollordners, älter 7 Tage gelöscht werden.
Damit wir innerhalb der Batch auch ein bisschen Struktur rein bekommen, können wir bestimmte Abschnitte auch kommentieren. Jeder Kommentar einer Zeile wird mit zwei Doppelpunkten eingeleitet ::

Unsere Batch sieht demnach so aus:

:: Datum umsetzen in YYYY-MM-DD
SET _DATUM=%date:~-4,4%-%date:~-7,2%-%date:~-10,2%

:: SPIEGELUNG
robocopy %userprofile% z:ziel%username% /B /MIR /R:1 /W:1 /TEE /NDL /NFL /NP  /LOG+:C:protokoll-ordnerprotokoll-%_DATUM%.txt

:: Löschen aller txt Dateien älter 7 Tage
forfiles /P „C:protokoll-ordner“ /M *.txt /S /D -7 /C „cmd /c del @File“ 2>&1 | find /v /i „ERROR: No files found with the specified search criteria.“

Wer das Prinzip mit den Variablen innerhalb einer Batchdatei „gefressen“ hat, wird sich bestimmt überlegen, ob man nicht die einzelnen Befehlsteile / Parameter von robocopy in solche Variablen packt. Gut weiter gedacht, machen wir auch aber später…..

…………………..Fortsetzung folgt immer mal wieder vorbei schauen………………….

……………….Über Anregungen als Kommentar würde ich mich freuen……………..

Noch ein paar ROBOCOPY Anwendungs-Beispiele:

Wenn man nur die Ordnerstruktur „OHNE“ jegliche Dateien kopieren möchte, dann so:
ROBOCOPY „QUELLE“ „ZIEL“ /MIR /XF ExFile *.*

Wenn man nur den ersten Ordnerlevel kopieren möchte dann so:
ROBOCOPY „QUELLE“ „ZIEL“ /MIR /LEV:1

**************************************************************************************************

Grundsätzliche Erläuterung zum Unterschied eines inkrementellen und differentiellen Backups

  • Bei beiden Versionen wird als erstes eine Komplettsicherung (KS) aller Dateien angelegt
  • Bei beiden Versionen wird eine erste Teilsicherung (TS1) aller zur KS geänderten und neuen Dateien angelegt
  • Bei der inkrementellen Sicherung wird eine weitere TS2 für alle nach der TS1 geänderten und neuen Dateien erstellt
    • Vorteil: schnelle Sicherung
    • Nachteil: Für die Wiederherstellung werden ALLE Teile (KS + TS1 + TS2 + …TSn) benötigt
  • Bei der differentiellen Sicherung wird eine weitere TS2 für alle nach der KS geänderten und neuen Dateien erstellt
    • Vorteil: Für die Wiederherstellung werden nur die Sicherungen: KS + TSn (letzte Teilsicherung) benötigt
    • Nachteil: Verbraucht mehr Platz, dauert länger (da die Datenmenge stetig wächst)

 zurück)

44 Kommentare

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.