Möchte man eine Datei oder Ordner auf Änderungen überwachen und dann im Falle des eintretens eines Ereignisses einen Befehl oder Skript ausführen, so bieten sich hierfür Tools wie watchexec oder Watchman an. In diesem Beitrag geht es um das erstgenannte Tool.

Die Handhabe von watchexec ist denkbar einfach:

watchexec <Befehl>

Beim simplesten Aufruf wird der aktuelle Ordner auf Änderungen überwacht und sobald eine Eintritt der angegebene Befehl ausgeführt.

Gezielt kann man mit “-w” den bzw. die zu überwachenden Ordner angeben:

watchexec -w <Ordner> <Befehl>

“-w” kann mehrfach angegeben werden:

watchexec -w <Ordner 1> -w <Ordner 2> <Befehl>

Das Tool bietet eine Vielzahl ein Parametern:

watchexec 1.12.0
Execute commands when watched files change

USAGE:
    watchexec [FLAGS] [OPTIONS] ...

FLAGS:
    -c, --clear                Clear screen before executing command
    -h, --help                 Prints help information
    -k, --kill                 Send SIGKILL to child processes (deprecated, use -s SIGKILL instead)
        --no-default-ignore    Skip auto-ignoring of commonly ignored globs
        --no-ignore            Skip auto-loading of ignore files (.gitignore, .ignore, etc.) for filtering
    -n, --no-shell             Do not wrap command in 'sh -c' resp. 'cmd.exe /C'
        --no-vcs-ignore        Skip auto-loading of .gitignore files for filtering
    -p, --postpone             Wait until first change to execute command
    -r, --restart              Restart the process if it's still running
    -V, --version              Prints version information
    -v, --verbose              Print debugging messages to stderr
    -W, --watch-when-idle      Ignore events while the process is still running

OPTIONS:
    -d, --debounce     Set the timeout between detected change and command execution, defaults to 500ms
    -e, --exts           Comma-separated list of file extensions to watch (js,css,html)
    -f, --filter ...        Ignore all modifications except those matching the pattern
    -i, --ignore ...        Ignore modifications to paths matching the pattern
    -w, --watch ...            Watch a specific directory
        --force-poll       Force polling mode
    -s, --signal             Send signal to process upon changes, e.g. SIGHUP

ARGS:
    ...    Command to execute

Wenn man nicht möchte, das direkt nach dem Start bereits einmal der angegebene Befehl ausgeführt wird, muss “-p” verwendet werden. Beendet bzw. abgebrochen wird mit “Strg + c”.

Nachdem die Parameter “/mon” und “/mot” von Robocopy nur bedingt dazu geeignet sind, um Änderung à la CDP in einen jeweiligen Ordner zu erfassen, bietet sich nun in der Kombi mit watchexec eine neue Gelegenheit.

Der Befehl zum Aufruf kann so aussehen:

watchexec -p -w C:\Source --force-poll 30000 cdp.cmd

“–force-poll” mit der Angabe von 30000 ms (30 s) ist in diesem Kontext notwendig, da sonst sowohl die geänderte Datei(en) als auch eine leere Kopie des Quellordners am Ziel erstellt wurden. Die Parameter muss man ggf. den eigenen Bedürfnissen anpassen. Anbei ein Beispiel-Skript für die Nutzung von Robocopy. Am Ziel-Ordner wird nach jeder Änderung ein Unterordner mit Zeitstempel erstellt, der die geänderte(n) Daten enthält.

@echo off


rem Konfiguration

 set source=C:\Source
 set destination=C:\Backup

rem Datum und Uhrzeit umwandeln

 set day=%date:~0,2%
 set month=%date:~3,2%
 set year=%date:~6,4%

 set hh=%time:~0,2%
 set mm=%time:~3,2%
 set ss=%time:~6,2%

rem Robocopy

 robocopy "%source%" "%destination%\%year%-%month%-%day%_%hh%-%mm%-%ss%" /s /xj /r:0 /w:0 /m /xx

Die Ausgabe sieht bei einem Durchlauf so aus:

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robustes Dateikopieren für Windows
-------------------------------------------------------------------------------

  Gestartet: Sonntag, 1. März 2020 22:29:55
   Quelle : C:\source\
     Ziel : C:\Backup\2020-03-01_22-29-55\

    Dateien : *.*

  Optionen: *.* /S /DCOPY:DA /COPY:DAT /XX /XJ /M /R:0 /W:0

------------------------------------------------------------------------------

         Neues Verz.       1    C:\source\test-ordner5\
100%        Neue Datei                 1        test-file5.txt

------------------------------------------------------------------------------

           Insgesamt   KopiertÜbersprungenKeine Übereinstimmung    FEHLER    Extras
Verzeich.:         8         8         0         0         0         0
  Dateien:         8         1         7         0         0         0
    Bytes:       280         1       279         0         0         0
   Zeiten:   0:00:00   0:00:00                       0:00:00   0:00:00


Geschwindigkeit:                 500 Bytes/Sek.
Geschwindigkeit:               0.028 Megabytes/Min.
   Beendet: Sonntag, 1. März 2020 22:29:55

Im Ziel-Ordner sieht es so aus:

28.02.2020  23:14    <DIR>          2020-02-29_12-08-09
28.02.2020  23:14    <DIR>          2020-02-29_12-08-35
28.02.2020  23:14    <DIR>          2020-02-29_12-08-42
28.02.2020  23:14    <DIR>          2020-02-29_12-08-44
01.03.2020  22:15    <DIR>          2020-03-01_22-15-39