Robocopy ist dafür bekannt Ordner-Strukturen zu kopieren, es ist allerdings auch möglich nur eine Datei zu kopieren.
Der einfachste Befehl sieht so aus:
robocopy <Quelle> <Ziel> <Datei>
Damit die Datei nur kopiert wird, wenn Sie sich geändert hat hängt man einfach noch ein “/xo” an:
robocopy <Quelle> <Ziel> <Datei> /xo
Ein kleines Beispiel, bei dem zwischen den beiden Robocopy-Aufrufen eine Änderung an der Datei stattgefunden hat:
C:\Temp>robocopy C:\Temp C:\Temp\Dest Test.txt /xo ------------------------------------------------------------------------------- ROBOCOPY :: Robustes Dateikopieren für Windows ------------------------------------------------------------------------------- Gestartet: Mittwoch, 27. November 2019 19:48:33 Quelle : C:\Temp\ Ziel : C:\Temp\Dest\ Dateien : Test.txt Optionen: /DCOPY:DA /COPY:DAT /XO /R:1000000 /W:30 ------------------------------------------------------------------------------ 1 C:\Temp\ ------------------------------------------------------------------------------ Insgesamt KopiertÜbersprungenKeine Übereinstimmung FEHLER Extras Verzeich.: 1 0 1 0 0 0 Dateien: 1 0 1 0 0 0 Bytes: 11 0 11 0 0 0 Zeiten: 0:00:00 0:00:00 0:00:00 0:00:00 Beendet: Mittwoch, 27. November 2019 19:48:33 C:\Temp>robocopy C:\Temp C:\Temp\Dest Test.txt /xo ------------------------------------------------------------------------------- ROBOCOPY :: Robustes Dateikopieren für Windows ------------------------------------------------------------------------------- Gestartet: Mittwoch, 27. November 2019 19:48:48 Quelle : C:\Temp\ Ziel : C:\Temp\Dest\ Dateien : Test.txt Optionen: /DCOPY:DA /COPY:DAT /XO /R:1000000 /W:30 ------------------------------------------------------------------------------ 1 C:\Temp\ 100% Neuer 20 Test.txt ------------------------------------------------------------------------------ Insgesamt KopiertÜbersprungenKeine Übereinstimmung FEHLER Extras Verzeich.: 1 0 1 0 0 0 Dateien: 1 1 0 0 0 0 Bytes: 20 20 0 0 0 0 Zeiten: 0:00:00 0:00:00 0:00:00 0:00:00 Geschwindigkeit: 5000 Bytes/Sek. Geschwindigkeit: 0.286 Megabytes/Min. Beendet: Mittwoch, 27. November 2019 19:48:48
Wie man an der Ausgabe erkennen kann, wird beim ersten Aufruf die Datei übersprungen, da sich nichts geändert hat, beim zweiten Aufruf wird die Datei kopiert, da sich zwischenzeitlich eine Änderung ergeben hat. Der Vollständigkeit halber: Ganz zu Beginn wurde die Datei mit dem gleichen Befehl initial kopiert.
Kopieren via Netzwerk
Das Ganze kann selbstverständlich auch via Netzwerk erfolgen. Hierzu bietet es sich an, den Parameter “/zb” anzuhängen:
robocopy <Quelle> <Ziel> <Datei> /xo /zb
Ist das Ziel z.B. ein NAS oder ein Computer außerhalb der Domäne so lässt sich zuerst eine Anmeldung am Zielcomputer durchführen und erst dann der Kopiervorgang durchführen. Ein kleines Beispiel-Skript:
@echo off net use \\Zielserver\Freigabe <Passwort> /user:<Zielserver\Benutzername> /persistent:no robocopy "D:\Daten" "\\Zielserver\Freigabe" "Datenbank.dat" /xo /zb net use \\Zielserver\Freigabe /d /y
Rückgabewert auswerten
Generell kann man bei Robocopy über den Parameter “/log:<Dateiname>” ein Protokoll erstellen lassen. Möchte man allerdings z.B. im Fehlerfall eine Benachrichtigung erhalten, so bietet es sich an den Rückgabewert auszuwerten:
- 0 – Keine Fehler, es wurde aber auch nichts kopiert. Gilt auch für übersprungene Dateien.
- 1 – Eine oder mehr Dateien wurden fehlerfrei kopiert.
Ein Rückgabewert jenseits von 1 bedeutet im Regelfall Schwierigkeiten.
robocopy <Quelle> <Ziel> <Datei> /xo if %errorlevel% gtr 1 ( <Aktion> )
Am Beispiel mit SMTPSend lässt sich eine E-Mail versenden:
robocopy <Quelle> <Ziel> <Datei> /xo if %errorlevel% gtr 1 ( echo Fehler beim Kopieren einer Datei > e-mail.txt echo %date% - %time% - %errorlevel% >> e-mail.txt smtpsend.exe -f<Absender-Adresse> -t<Empfänger-Adresse> -h<Mailserver> -sRobocopy-Fehler -ie-mail.txt -lu<Benutzername-des-Absender> -lp<Kennwort> )
Oder mit Windows-Bordmitteln Einträge ins Ereignisprotokoll schreiben:
robocopy <Quelle> <Ziel> <Datei> /xo if %errorlevel% gtr 1 ( eventcreate /id 100 /l application /t ERROR /so "Robocopy" /d "Fehler beim Kopieren einer Datei" )
Quelle:
stackoverflow – Use Robocopy to copy only changed files?
Verheiratet, Vater von zwei Kindern, eines an der Hand, eines im Herzen. Schon immer Technik-Freund, seit 2001 in der IT tätig und seit über 10 Jahren begeisterter Blogger. Mit meiner Firma IT-Service Weber kümmern wir uns um alle IT-Belange von gewerblichen Kunden und unterstützen zusätzlich sowohl Partner als auch Kollegen.
Hi Andy,
Deine Beschreibung des Befehls /XO ist leider falsch. Mit diesem Befehl werden Dateien ausgeschlossen, die älter sind. Das “X” bedeutet bei Robocopy immer “excluded”.
Hier ein Zitat aus der einer Refernz von Microsoft, die leider nicht mehr online ist:
“/XO Excludes files tagged as “Older”.”
Warum wird Deine modifizierte Datei trotzdem kopiert? Per Default ist im Programmaufruf der Befehl “/COPY:DAT” eigestellt, siehe auch Deine Listings oben. Der Befehl bewirkt folgendes, auch aus der besagten Referenz:
“Selectively Copying File Data
Once a file has been selected for copying, you can choose precisely which data
associated with the file is copied using the /COPY:copyflags command line argument,
where copyflags can be any combination of the following :
· D to copy file Data
· A to copy file Attributes
· T to copy file Timestamps
· S to copy NTFS Security information (ACLs)
· O to copy NTFS Ownership information
· U to copy NTFS aUditing information
For ease of use the following alternative switches are also provided :
· /COPYALL copies everything (equivalent to /COPY:DATSOU).
· /NOCOPYcopies nothing (which can be useful if /PURGE is also used).
· /SEC copies data, attributes, and NTFS ACLs (like /COPY:DATS).
Any combination of these flags can be used, if you have the appropriate access rights.
However, if file data is copied, file timestamps are also copied.
By default Robocopy assumes /COPY:DAT, and will copy file data, attributes, and timestamps.”
Die timestamps werden automatisch in Deinem Beispiel mit übertragen, welche Robocopy vergleicht und bei einem neueren timestamp die Datei kopiert. Den Parameter “T” kann man bei “/COPY:” auch weglassen, da mit dem Parameter “D” der timestamp mitkopiert wird. Das siehst Du im Befehel “/DCOPY:DA”, da ist es ausgeführt und nur neuere directories werden kopiert, sofern im Zielverzeichnis schon vorhanden.
Gruss
Lupo