Windows: Mit Robocopy nur eine Datei kopieren, wenn Sie geändert wurde

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?

ss64 – Robocopy Exit Codes

Ein Kommentar

  • Wolfgang Schöbel

    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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.