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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.