Das nachfolgende Skript ist eine konzeptionelle Arbeit.
Das Skript soll als Anschaungsbeispiel dienen, wie eine Datei-Synchronisation mit Robocopy durchgeführt werden kann. Die Quelle wird authentisiert und eingebunden, das Ziel wird nicht authentisiert, es wird angenommen, dass dazu Zugriffsberechtigungen bereits bestehen.
ACHTUNG, WICHTIGER HINWEIS!
Dieses Skript ist Teil der Projekt-Dokumentation. Es ist NICHT zur Verwendung im Betrieb gedacht. Jede Nutzung erfolgt in eigener Verantwortung! Der Verfasser übernimmt dementsprechend keinerlei Verantwortung für Fehlerfreiheit, Vollständigkeit oder Eignung für einen bestimmten Zweck.
Bitte testen Sie ein Skript, das Sie auf der Grundlage der hier dargestellten Konzepte erstellen, gründlich in einer sicheren Umgebung, bevor Sie es in einer Produktionsumgebung verwenden.
- Einleitung
- Was macht dieses Skript?
- Ablauf & Funktionsweise
- Konfiguration
- Beispiel für einen Kopiervorgang
- Logdateien & Auswertung
- Tipps & Hinweise
- Verzeichnisstruktur
Dieses kleine Set an PowerShell-Skripten dient dazu, mit Robocopy Daten von einem Ort A zu einem Ort B zu kopieren und dabei die wichtigsten Informationen zum Kopiervorgang in Logdateien zu schreiben. Ziel ist es, nachvollziehen zu können, wann was kopiert wurde, wie Robocopy dabei abgeschnitten hat und ob Fehler aufgetreten sind.
Das Skript ist ein Anschauungsbeispiel für Admins und Power-User, um eigene Skripte zu erstellen.
- Startet Robocopy mit den gewünschten Parametern
- Schreibt während des Kopiervorgangs eine Lock-/Statusdatei, damit keine zwei Kopien gleichzeitig laufen
- Protokolliert Start und Ende jedes Kopiervorgangs in CSV und JSONL-Logdateien
- Optional: Schickt Benachrichtigungen per E-Mail (wenn konfiguriert)
- Gibt alle wichtigen Schritte und den Robocopy-Output direkt auf der Konsole aus
Der Ablauf ist wie folgt:
-
Start
-
Konfigurationsdatei bestimmen:
- Wenn beim Start ein Parameter
-ConfigPathübergeben wird und die Datei existiert, wird diese verwendet. - Sonst wird geprüft, ob es eine Datei
config/<MASCHINENNAME>.ymlgibt (z.B.config/SMB-DESTINATION.yml). Wenn ja, wird diese genutzt. - Sonst wird auf
config/sync_config.ymlzurückgegriffen. - Falls keine dieser Dateien existiert oder lesbar ist, bricht das Skript mit einer Fehlermeldung ab.
- Wenn beim Start ein Parameter
-
Lock-/Statusdatei anlegen:
- Im Hauptverzeichnis wird eine Datei wie
<MASCHINENNAME>_ROBOCOPY_IN_PROGRESS_<Datum>_<Uhrzeit>.lockerstellt (z.B.SMB-DESTINATION_ROBOCOPY_IN_PROGRESS_0417_181447.lock). - Existiert bereits eine solche Datei für den eigenen Rechnernamen, wird der Kopiervorgang abgebrochen und ein entsprechender Logeintrag (Status: LOCKED) in CSV und JSONL geschrieben.
- LOCK-Dateien anderer Rechner werden ignoriert und blockieren den lokalen Kopiervorgang nicht.
- Im Hauptverzeichnis wird eine Datei wie
-
(Optional) SMB-Share mounten:
- Falls in der Konfiguration hinterlegt, wird versucht, das Quellverzeichnis mit angegebenen Zugangsdaten zu mounten.
-
Robocopy-Befehl zusammenbauen und anzeigen:
- Der komplette Befehl wird auf der Konsole ausgegeben, z.B.:
About to run: robocopy "\\smb-source\source" "c:\dest" /MIR /Z /FFT /R:3 /W:5 /MT:64 /NFL /NDL
- Der komplette Befehl wird auf der Konsole ausgegeben, z.B.:
-
Robocopy ausführen:
- Die Ausgabe von Robocopy wird live auf der Konsole angezeigt.
-
Protokollierung:
- Nach Abschluss (egal ob erfolgreich oder mit Fehler) wird ein Eintrag in die Logdateien geschrieben (siehe unten).
-
Lock-/Statusdatei löschen:
- Am Ende wird die Lockdatei entfernt.
Die Konfiguration erfolgt über YAML-Dateien im config/-Verzeichnis. Die wichtigsten Felder:
job:
source: "\\\\smb-source\\source"
destination: "c:\\dest"
robocopy_flags: "/MIR /Z /FFT /R:3 /W:5 /MT:64 /NFL /NDL"
max_runtime_minutes: 60
auth:
use_kerberos: false
remote_domain_user: ""
password_env_var: ""
logging:
log_dir: "logs"
machine_log_format: "csv,json"
enable_rotation: true
retention_days: 30
alerts:
enabled: false
smtp_server: ""
from: ""
to: []
on_start: false
on_abort: false
on_complete: falseHinweis:
Die Datei kann z.B. sync_config.yml heißen oder <MASCHINENNAME>.yml (z.B. SMB-DESTINATION.yml).
Konsolenausgabe:
Remote Fileshare as configured: \\smb-source\source
Connecting to Remote Host \\smb-source\source using user account SMB-Source\transfer to mount data source.
LOCK file created: C:\Users\timw\Documents\SMB-Sync\SMB-DESTINATION_ROBOCOPY_IN_PROGRESS_0417_181447.lock
About to run: robocopy "\\smb-source\source" "c:\dest" /MIR /Z /FFT /R:3 /W:5 /MT:64 /NFL /NDL
Robocopy output:
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------
... (Robocopy-Ausgabe) ...
Robocopy completed successfully. Exit code: 1
Logs written to: logs
LOCK file removed: C:\Users\timw\Documents\SMB-Sync\SMB-DESTINATION_ROBOCOPY_IN_PROGRESS_0417_181447.lock
Beispiel für einen abgelehnten Kopiervorgang wegen LOCK-Datei:
Lock file exists for this host: C:\Users\timw\Documents\SMB-Sync\SMB-DESTINATION_ROBOCOPY_IN_PROGRESS_0417_181447.lock. Exiting.
Beispiel für einen JSONL-Eintrag bei LOCK:
{"timestamp_start":"2025-04-17 18:37:49","timestamp_end":"2025-04-17 18:37:49","duration_seconds":0,"hostname":"SMB-DESTINATION","status":"LOCKED","exit_code":100,"event_type":"END","command":"","summary":"Kopiervorgang abgebrochen: Bereits laufender Kopiervorgang auf diesem Host (SMB-DESTINATION)."}- CSV-Log:
Jede Maschine schreibt ihr eigenes Log, z.B.logs/SMB-DESTINATION_log.csv - JSONL-Log:
Für maschinelle Auswertung, z.B.logs/SMB-DESTINATION_log.jsonl
Beispiel für einen JSONL-Eintrag:
{"timestamp_start":"2025-04-17 18:37:49","timestamp_end":"2025-04-17 18:37:54","duration_seconds":5,"hostname":"SMB-DESTINATION","status":"COMPLETED","exit_code":1,"event_type":"END","command":"robocopy \"\\\\smb-source\\source\" \"c:\\dest\" /MIR /Z /FFT /R:3 /W:5 /MT:64 /NFL /NDL","summary":"Robocopy exit code: 1","robocopy_stats":{"files_failed":0,"files_extras":0,"files_total":25,"files_copied":25,"files_skipped":0}}- Die Skripte sind für PowerShell unter Windows gedacht.
- Die Lockdatei verhindert Doppelstarts – bei Problemen ggf. manuell löschen.
- Sie signaliert aber auch anderen, dass aktuell noch ein Kopiervorgang läuft, und die Daten evtl. für eine weitere Übernahme noch nicht vollständig sind.
- Für die E-Mail-Benachrichtigung müssen SMTP-Parameter korrekt gesetzt sein.
SMB-Sync/
├── config/
│ ├── <MASCHINENNAME>.yml
│ └── sync_config.yml
├── logs/
│ ├── <MASCHINENNAME>_log.csv
│ ├── <MASCHINENNAME>_log.jsonl
├── scripts/
│ ├── Utils.ps1
│ ├── Log-Handler.ps1
│ ├── Alert-Handler.ps1
├── run_sync.ps1
└── README.md