The estimated reading time 3 minutes
Robocopy kopieren / synchronisieren und Log erstellen mit aktuellem Datum
Hallo zusammen,
immer wieder kommt es vor, dass zwei oder mehr Ordner synchronisiert werden sollen. Teilweise bei Fileserver Migrationen etc.
Hierfür gibt es ein Tool, welches Microsoft ab Windows Vista / Windows Server 2008 standardmäßig bereitstellt. Für alle älteren Versionen von Windows gibt es dieses als „Windows Ressource Kit“ herunterzuladen. http://www.microsoft.com/en-us/download/details.aspx?id=17657
Auf den Rechern ab Windows Vista und später kann dieses Tool über die Powershell oder die normale CMD Konsole aufgerufen werden.
Dazu WindowsTaste + R drücken und in das „Ausführen“ Feld (im Englischen RUN) CMD eingeben
nun erscheint die schwarze Konsole
Nun kann Robocopy eingegeben werden und die wichtigsten Optionen für diese EXE werden angezeigt.
Hier das Ergebnis:
Man kann sehen, dass Robocopy immer nach dem gleichen Muster funktioniert nämlich die robocopy.exe aufrufen (.exe muss nicht dranstehen) danach kommt die Quelle (also der Ordner der kopiert werden soll), dann das Ziel ( also der Zielordner) und dann die Optionen/ Schalter (was soll Robocopy machen)
mit dem Befehl robocopy /? können alle Optionen angezeigt werden. Eine Übersicht findet sich auch auf der Technet Website: http://technet.microsoft.com/de-de/library/cc733145(v=ws.10).aspx
Um einfach zu beginnen kann man folgendes in die CMD eintippen
robocopy C:\Users\%username% D:\Benutzerdaten /mir
Wenn eine D Partition oder eine Festplatte vorhanden ist, spiegelt Robocopy nun euren angemeldeten Benutzer auf die D Partition (%username% ist eine Variable des Systems)
Diesen Befehl kann man nach Belieben erweitern.
Um zum Beispiel Dokumente auf meine externe NAS (Laufwerk Y:) zu sichern habe ich folgendes Script gemacht.
echo@off robocopy C:\Users\%username%\Documents\aktuelle-Dokumente Y:\aktuelle-Dokumente /mir /R:2 /W:3 /LOG+:"Y:\Sicherungslogs\log-%date:~0,2%-%date:~3,2%-%date:~6,4%-%time:~0,2%-%time:~3,2%-%time:~6,2%.log" /TEE /NDL pause
/R:2 = zweimaliges Versuchen bei Zugriffsproblemen
/W:3= Warte zwischen den Wiederholungen 3 Sekunden
/LOG+: = Schreibe ein Logfile in den vorgegebenen Pfad
/TEE = Anzeigen am Bildschirm (wird nur benötigt wenn ein ein Log geschrieben wird, da man sonst den Fortschritt nicht sehen kann)
/NDL = keine Verzeichnisse in die LogDatei eintragen (dient der Übersicht)
/XD = Verzeichnis auslassen
/XF =Datei auslassen
Nun erstellt mir das Robocopy eine Log Datei die fortlaufend nach dem Datum der Ausführung benannt ist
Natürlich ist Robocopy auch batchfähig und auch dafür gedacht. Es gibt noch sehr viel mehr Funktionen, einfach mal anschauen.
Helfe auch gerne bei Problemlösungen.
Viel Spaß beim nachbauen und selber testen. Ich freue mich über Kommentare.
Zusatz: Hier noch eine Batchdatei, die zuerst einen Ordner mit dem aktuellen Datum erstellt und dann einen beliebigen Ordner hineinsichert
@echo off echo ########Sicherung ############## set SICHERUNGSORDNER="C:\temp-Backups\%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:\XXXXXXXXXX\XXXX" %SICHERUNGSORDNER% /mir /R:2 /W:3 /LOG+:"C:\log\%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%.log" /TEE /NDL
Update 13.11.2018
Da immer wieder die Frage bezüglich NTFS Berechtigungen oder Zeitstempel aufkommt, hier noch weitere Parameter. Standardwert ist /COPY:DAT (Daten,Attribute,Zeitstempel)
/COPYALL (Kopiert Zeitstempel, NTFS Berechtigungen, Attribute)
/SEC (= /COPY:DATS Kopiert Daten, Zeitstempel und Sicherheitsberechtigungen)
/DCOPY:T (Kopiert Ordner Zeitstempel)
/TIMFIX (Übernimmt nur Zeitstempel von Quelle auf Ziel)
HINWEIS: der Code für das Datum funktioniert nur in BATCH Files, wird robocopy innerhalb einer PowerShell Sitzung angewendet bricht diese mit einem Fehler ab.
Lest auch meinen Artikel zur automatischen Erstellung von Robocopy Jobs bei einer Fileserver Migration
Ich war auf der Suche nach einem Backup-Programm, das meinen Wünschen entsprach, als ein PC-Profi mir robocopy vorschlug.
Seitdem nehme ich das für das Backup meiner Datenbank / Datensammlung. Konfigurierte Batch aufrufen; fertig.
Seit Dienstag habe ich eine neue SSD eingebaut (früher Backups auf externe HD) & ich bin begeistert. 126 GB Datenbank-Initialisierung (erstes Kopieren) in 3,5 Minuten(früher 24 Minuten), Backup-Dateivergleich (~71,000 Dateien) in 3 Sekunden.
Da ich meinen PC sowieso mit shutdown herunterfahre, schnell eine neue Batch geschrieben & voila: nie wieder Datensicherung vergessen. Etwa einmal pro Monat Sicherung weiterhin auf externe HD.
Auf der Suche nach der Syntax der Log-Variablen fand ich hier her, da ich nun auch gleich noch andere wichtige Verzeichnisse mitsichere. So hat man einen guten Überblick, ob alles in Ordnung ist.
Danke für das Einbinden des Datums in den Logfile-Namen. Das macht das Ganze richtig komfortabel. Das Einzige, das mich stört ist die fehlende 0 vor einstelligen Stundenangaben. Gibt es da einen Weg eine führende Null einzufügen?
Grüßle
Andreas
Hallo Andreas,
meine Lösung wäre hier den Lognamen inklusive Datum innerhalb von PowerShell zu erstellen, sprich robocopy mit Variablen über PowerShell zu füttern. Geht in den meisten Fällen sehr gut.
Ansatz: Get-Date -Format yyy-MM-dd-hh-mm-ss
Viele Grüße
Da die Parallisierung mit Robocopy meines Erachtens kaputt ist, kann ich empfehlen der Geschwindigkeit zu liebe mehrere Fenster aufzumachen und mehrere Prozesse zu starten (wenn man mehrere unabhängige Ordner/Laufwerke zum Synchronisieren hat). Ich habe dann unterschiedliche Farben für die CMD genommen, dann verliert man nicht den Überblick.
Man sollte auch darauf achten, die alte Robocopy-Version (z.B robocopy Version XP010) zu nehmen. Die neueren erkennen aus unerfindlichen Gründen manchmal identische Dateien nicht.
[…] Robocopy kopieren / synchronisieren und Log erstellen mit … […]
Hallo,
vielen Dank für den tollen Überblick. Ich bin jedoch etwas verwirrt. Ich nutze RC und alles startet ohne Probleme. Jedoch Passiert einfach „nichts“. Ich sehe im Taskmanager das ich 250-500 Mbit/s Traffic auf der Netzwerkkarte bekomme, jedoch wird der Job nie fertig gestellt. Nach 11 Stunden ist der Traffic durch und es ist Ruhe im Netzwerk, jedoch sind noch nicht alle Daten inkrementell kopiert. Ich kopiere von einer NAS Backupdateien des Servers auf ein RDX Laufwerk.
Folgende Abfolgen habe ich beide ergebnislos getestet:
robocopy \\BM-Veeam\Veeam-Sicherung E:\ /MIR /J /EFSRAW /NOOFFLOAD /R:3 /W:2
robocopy \\BM-Veeam\Veeam-Sicherung E:\ /MIR /FFT /R:3 /W:10 /Z /NP /NDL
robocopy \\BM-Veeam\Veeam-Sicherung E:\ /MIR /ZB /MON:1 /MT:8 /FFT /DST / R:5
Ich finde da einfach nicht den Denkfehler.
Vielleicht habt Ihr einen Tipp für mich. Danke
LG
Ener
Hallo Ener,
danke für das Feedback. Leider spielen in deinem Szenario mehrere Faktoren eine Rolle. Zum einen haben wir Robocopy und dann auch noch die Anbindung des RDX Laufwerks. Ehrlich gesagt weiß ich nicht ob Robocopy hier das richtige ist.
Du könntest auch mal einen anderen Ansatz versuchen und über Veeam die Backups auf RDX zu sichern? Laut Hersteller ist das auch offiziell supported.
Hier mal ein Paar links:
Falls es Robocopy sein soll, könnte man das RDX auch mal freigeben (Laufwerk E auf dem Geräte als Netzwerklaufwerk erstellen) und dann versuchen Robocopy auf das Netzlaufwerk schreiben zu lassen.
Schon mal die Standard Robocopy Parameter versucht?
Also
robocopy "\\BM-Veeam\Veeam-Sicherung" "E:\" /E /COPYALL
Das wären meine Ansätze.
Viel Erfolg.
Hallo, danke für diese schöne Übersicht. Ich habe anhand des Artikels einen Backupjob gebaut der auch incl. log funktioniert nun habe ich aber eine Frage wäre es möglich ihm zu sagen, dass er nur 20 Logs schreiben darf und ggf. der Reihe nach die alten Logs überschreibt da es sonst relativ schnell sehr unübersichtlich wird (auch bezüglich der Begrenzung im Ordner?MfG
Hallo Dominique,
man könnte das ganze auch als PowerShell Script laufen lassen (Robocopy Job) und nach dem Kopiervorgang alte Logs löschen (nach Datum). Hier kann auch mein PowerShell Script für Exchange verwendet werden.
### removing old .log files
$fileextension = "log"
$logpathfolder ="C:\logfolder"
$days=10
Write-Host "removing logfiles older than $days days from logpath $logpathfolder "
$limit = (Get-Date).AddDays(-$days)
$logfiles = Get-ChildItem -Path "$logpathfolder" -Include "*.$fileextension" -Recurse | Where-Object {($_.LastWriteTime -lt $limit) }
foreach($log in $logfiles){
$logname = $log.Name
$logfilepath = $log.fullname
Write-Host "Deleting Log file $logname, because it's older than $days" -ForegroundColor Gray
Remove-Item -Path $logfilepath -Force -Confirm:$false
}
Bei weiteren Fragen einfach nochmals melden.
Viele Grüße
Alexander
Hallo, danke für das Skript, eine Frage hierzu, wie kann ich das Skript so bauen, dass jeweils nach 5 Tagen die letzten 4 Tage gelöscht werden und er dann wieder dann wieder 4 neue erstellt für die nächsten 4 tage? (Oder 7 Tage)
Ich habe hier ein Beispiel : robocopy C:\Test23\ Z:\Test23\ /MIR /R:3 /W:4 /LOG:Z:\Logdateien\logdatei.txt
Hallo A.K.
Ich benutze robocopy seit einigen Jahren und bin absolut überzeugt von der Qualität des Programms. Einmal pro Woche sichere ich mein komplettes Home-Verzeichnis damit (z.Zt. ca. 320GB) und erzeuge jeweils auch ein Logfile. Jetzt meine Frage:
1. Gibt es eine Zusammenstellung/Übersicht der Informationen im Logfile (was bedeuten welche Informationen, z.B. die Zahl vor der Zeile mit dem Dateinamen der gerade bearbeiteten Dateien)?
2. Gibt es eine Möglichkeit, in der Logdatei die Dateizeilen auszublenden, wo robocopy im Prinzip sagt „Alles beim alten – nix weiter getan – nächste Datei !“. Also so, dass zum Schluss nur diejenigen Dateien in der Logliste auftauchen, die im Ziel geändert wurden (Also gelöscht, neu hinzugefügt oder geändert)?
Schon mal Danke! für die Antwort.
Und bleib gesund …
Hi Manfred,
ich finde robocopy auch ein großartiges Tool. Naja so auf die Schnelle habe ich keine Zusammenfassung gefunden, aber die Zahl die du vermutlich meinst, ist Kopiervorgang in Prozent (?!)
Zu Punkt 2, versuch mal folgenden Befehl:
robocopy C:\folder1 C:\folder2 /mir /R:2 /W:3 /LOG+:"C:\log\log-%date:~0,2%-%date:~3,2%-%date:~6,4%-%time:~0,2%-%time:~3,2%-%time:~6,2%.log" /TEE /NDL /NP
Diese schreibt ins Log nur die veränderten Dateien (also die Neueren).
Viele Grüße
Alexander
Hallo Alexander,
habe mit Robocopy bis jetzt immer gute Erfahrungen gemacht, nun stehe ich aber vor folgender Herausforderung:
Mittels robocopy sollen Files swischen einen Member-Server und Domain-Joined Server synchronisiert werden.
Problem: ich möchte nicht Benutzername/Kennwort im Klartext mit angeben um auf dem Share zugreifen zu können.
Frage: gibt es irgend eine Möglichkeit das Kennwort in verschlüsselter Form (z.B. via Powershell) zu hinterlegen?
viele Grüße,
Jürgen
Hallo Jürgen,
ja es gibt sogar mehrere Möglichkeiten. Wenn ich dieses Szenario habe, verwende ich meistens den Windows Credential Manager
Damit kannst du den Namen / IP hinterlegen und jedes Mal wenn Windows auf diese Ressource per SMB zugreift, dann werden die Anmeldedaten verwendet.
Andere Variante wäre direkt per PowerShell: New-SmbMapping -LocalPath ‚X:‘ -RemotePath ‚\\Contoso-SO\VMFiles‘ -UserName „user@domain.com“ -Password „$pw“
Zur Verschlüsselung des Passwortes habe ich folgende Methode beschrieben, ist nicht 100 Prozent gut, aber auf jeden Fall 100 mal besser als Klartextpasswort
Viele Grüße Alex
Hallo, ich möchte verschiedene Verzeichnisse kopieren und diese aus einer Liste auslesen lassen. Z.B. sollen in der Liste
folder1
folder2
stehen und diese beiden sollen dann in einen Zielordner Backup kopiert werden. Wie lasse ich robocopy diese Liste einlesen, so dass er mir dann folder1 und folder2 in das Verzeichnis backup kopiert?
Hallo André,
hast du bereits meinen zweiten Artikel zu diesem Thema gesehen?
Das macht eigentlich genau deine Anfrage.
Viele Grüße
Alex
Hallo in die Runde,
ich habe folgende Aufgabenstellung:
Es sollen Printfiles (PCL und ZPL) aus einem Importverzeichnis von Server 1 \\server1\Import
nach
\\server2\ShipmentDocs
kopiert werden.
Aus dem Zielverzeichnis werden sie dann in eine MSSQL importiert und dort von aus über Scanevents aufgerufen.
Server1 und Server2 haben unterschiedliche User, die als local admin sämtliche Freigaben besitzen.
anschließend werden files älter 5 Tage gelöscht. Das funktioniert auch.
@echo
echo Muell
echo ####################################################
mkdir d:\zpl-muell
echo Dateien, die älter sind als 5 Tage, verschieben
echo ####################################################
robocopy.exe D:\ZPL D:\zpl-muell /E /MOVE /MINAGE:5 /R:1 /W:1 /NP /LOG+:robocopy.log /E
echo Muell Verzeichnis leeren
echo ####################################################
rmdir D:\zpl-muell /s /q
Leider komme ich bei dem Kopieren nicht voran…(push F1*F1*F1F1*F1*F1F1*F1*F1F1*F1*F1F1*F1*F1F1*F1*F1…no result… :/ )
Hallo,
wie werden denn die beiden Server gemappt? Hast du ein bereits bestehendes Laufwerk für beide? Du kannst als einfachste Methode mal im Windows Anmeldetresor die UNC Pfade der beiden Server hinterlegen (jeweils den richtigen Benutzer „Server1“ bei Adresse). Dann im Robocopy mal die UNC Pfade angeben robocopy „\\server1\“ „\\server2\“ ….
Falls ich es falsch verstanden habe, müsstest du genau beschreiben was nicht geht und welche Fehler genau kommen. Natürlich was du auch bereits versucht hast.
Viele Grüße
Alex
Guten Abend Herr Köhler,
ein sehr schöner Beitrag.
Mal eine vielleicht nicht all zu blöde Situation:
Ich würde mir Robocopy gerne eine lokale Datei kopieren ohne im Zielverzeichnis (Fileserver) die Optionen (MIR (/E mit /Purge) auszuführen, wegen der bereits erwähnten Löschung.
Das Zielverzeichnis beinhaltet nämlich nicht nur meine Datei vom lokalen System sondern auch die meines Kollegen, die er vielleicht dort direkt bearbeitet.
Konkret würde ich also gerne eine lokale Quelldatei auf einem Fileservice Zielort ablegen wollen.
Bisher kriege ich es nur hin, dass Ordner abgeglichen werden bzw. Quelle und Ziel immer nur Ordner akzeptiert werden; keine Dateinamen.xlsx 😉
Allgemein habe ich ein Problem mit copy und xcopy: Die unterstützen keine UNC-Pfade und ich möchte nicht zwingend ein Netzlaufwerk anbinden.
Meinen Sie, dass es mit Robocopy geht einzelne Dateien zu kopieren (entweder als Platzhalter z.B. *.xlsx oder eben gezielt eine bestimmte Datei)?
Ich hoffe, dass ich meine Frage verständlich formuliert ist.
Der „Kommentar“ ist daher kein richtiger Kommentar und kann daher auch gerne gelöscht werden.
Über eine Rückmeldung, vielleicht sogar per E-Mail, würde mich freuen.
Beste Grüße
Alex Fink
Hallo Alexander,
das Kopieren von einzelnen Dateien ist mit robocopy möglich. Funktioniert folgendermaßen:
Robocopy.exe "C:\_install\" "C:\temp\" "sample.xlsx"
Man gibt zunächst Quelle und Ziel als Ordner an, danach kann die Datei bzw. kann auch mit Wildcards gearbeitet werden ( wenn ich alle .exe Dateien kopieren möchte dann gebe ich *.exe an)
Robocopy.exe "C:\_install\" "C:\temp\" "*.exe"
Viele Grüße Alexander
Hi Alex 😉
viiiiieeeelen Dank für die Info.
Es hat genauso funktioniert.
Allerdings habe ich im Script Variablen deklariert.
Dazu ist es wichtig zu wissen, dass man den Inhalt der Variable für Dateiname oder Wildcard mit dem Apostroph (‚) definieren muss, damit man die Anführungszeichen („) in der robocopy-Syntax nicht mehr mit angeben muss.
Ich hatte es vorher nicht begriffen, dass ich den Dateinamen am Ende angeben muss, weil der Dateiname scheinbar gleich behandelt wird (sowohl für Quelle, als auch Ziel). Irgendwie logisch 😉
Nach ein wenig hin- und herprobieren für den Dateinamen hat das System partout die Anführungszeichen nicht angenommen, aber für die „Quelle“ und „Ziel“ hat es funktioniert und ist genauso erforderlich. Hier reicht das Apostroph nicht.
Vielleicht ist es noch ein Bug in Robocopy.
daher so möglich…
set quelle="C:\Quell-Pfad"
set ziel="\\remote-PC\Ziel-Pfad"
set dateiname='datei.xlsx'
Robocopy.exe %quelle% %ziel% %dateiname%
…und dann kann man auch die Variablen einfach in der Robocopy-Syntax verwenden.
Zusatzinfo der Vollständigkeit halber (nice2know):
Man kann beim Dateinamen durch Leerzeichen mehrere Dateien bzw. Wildcards, auch in Kombination angeben, sodass mögliche vorhandene Dateitypen für die Dateiübertragung einbezogen werden:
z.B.: set dateien=’Exceldatei.xlsx *.exe *.docx *.etc‘
Vielen Dank noch einmal.
Beste Grüße
Alex
Hallo,
ich bin dringend auf der Suche nach einer Lösung für folgendes Problem:
Bisher habe ich eine einfache Batch-Datei zur Datenübertragung mit xcopy gemacht. Ich habe einen Quellordner an dem ich täglich arbeite. Am Ende des Arbeitstages will ich mithilfe meiner Batch-Datei alle geänderten und neuen Dateien auf mein Ziellaufwerk übertragen. Mit xcopy war das danke des Befehls „/d“ (Kopiert alle Quelldateien, die neuer sind als die im Ziel befindlichen Dateien) eine einfache Lösung. Leider stößt der Ordner inzwischen an die 255-Zeichen-Grenze, weshalb ich auf robocopy umsteigen muss. Ich finde aber keinen äquivalenten Befehl vom Umfang „/d“, der mir ermöglicht ohne weitere Datum-Eingabe ein wachsendes Verzeichnis zu pflegen..
Können Sie mir weiterhelfen?
Liebe Grüße
Oli
Hi,
naja so ganz verstehe ich die Frage nicht. robocopy mit dem Parameter /mir spiegelt ein Verzeichnis. Wenn es die entsprechenden Ordner respektive Dateien schon gibt, vergleicht es und überschreibt die Dateien auf dem Ziel Ordner mit den neuen aus dem Quellordner. Somit eine inkementelle Sicherung. Mit Robocopy werden keine Datumangabe benötigt.
Wenn es darum geht Versionsstände aufzuheben, dann könnte zuerst ein Ordner mit dem aktuellen Datum erstellt werden und dann dort jeweils eine Vollsicherung gemacht werden (ich glaube aber das war nicht die Frage)?
Frage beantwortet? Ansonsten gerne nochmals schreiben.
Viele Grüße an den Bodensee.
Alexander
Ich nehme für ähnliche Szenarien robocopy /E
Bei /MIR besteht die Gefahr, dass eine versehentlich in der Quelle gelöschte Datei auch gleich im Backup-Ziel gelöscht wird. Somit etwas „riskant“ für eine tägl. inkrementelle Sicherung.
Ja das ist vollkommen richtig, für dieses Szenario.
Viele Grüße
Hi Alex und Verena
danke für die Hilfe.
Gruß Klaus