Selektives Kopieren
Von der internen Festplatte meines Windows-Rechners möchte ich Bilder auf eine externe Festplatte kopieren. Es sollen jedoch nur die Dateien kopiert werden, die noch nicht im Zielverzeichnis existieren. Bereits vorhandene sollen nicht noch einmal kopiert werden, da sonst gemachte Änderungen verloren gingen. Kennen Sie dafür eine Lösung?
Von der internen Festplatte meines Windows-Rechners möchte ich Bilder auf eine externe Festplatte kopieren. Es sollen jedoch nur die Dateien kopiert werden, die noch nicht im Zielverzeichnis existieren. Bereits vorhandene sollen nicht noch einmal kopiert werden, da sonst gemachte Änderungen verloren gingen. Kennen Sie dafür eine Lösung?
So trivial wie die Aufgabe zunächst anmutet, ist sie bei näherem Hinsehen dann doch nicht. Mit einem einzelnen Befehl ist es nicht getan, es muss schon eine kleine Batch-Datei sein:
@echo off
setlocal enabledelayedexpansion
rem *** Benutzerspezifische Anpassungen ***
set quelle=c:\Daten\Neu\Kamera
set ziel=f:\Bilder
set maske=*.tif
rem *** Ende der Anpassungen ***
echo. > %temp%\schonda.txt
for /f "tokens=*" %%d in ('dir "%ziel%\%maske%"/b /s') do (
set zieldatei=%%d
set quelldatei=!zieldatei:%ziel%\=%quelle%\!
echo !quelldatei! >> %temp%\schonda.txt
)
xcopy "%quelle%\%maske%" "%ziel%" /s /i /c /k /e /exclude:%temp%\schonda.txt
del %temp%\schonda.txt
Die Datei erhalten Sie auch ĂĽber den Soft-Link.
Vor dem ersten Einsatz mĂĽssen Sie in den Variablen quelle, ziel und maske angeben, von wo nach wo das Skript welche Dateitypen kopiert soll.
Der Befehl xcopy verwendet die Option /exclude, um die schon vorhandenen Dateien zu ĂĽberspringen. Deren Namen erwartet er nicht direkt, sondern man muss eine Textdatei angeben, in der sie stehen. Diese Datei erzeugt die for-Schleife: Sie iteriert ĂĽber die Ausgabe des Befehls
dir "%ziel%\%maske%" /b /s
also ĂĽber ein rekursives Inhaltsverzeichnis des Zielordners. Besonders trickreich ist die Zeile
set quelldatei=!zieldatei:%ziel%\=%quelle%\!
Sie speichert nämlich in der Variablen quelldatei den Inhalt von zieldatei und ersetzt dabei den Namen des Zielordners durch den des Quellordners. Das Ergebnis ist ein Dateiname, der sich auf den Quellordner bezieht, den xcopy also übergehen soll. Die hier und in der nächsten Zeile verwendeten Ausrufezeichen kennzeichnen ähnlich wie die gewohnten Prozentzeichen eine Variable. Der Unterschied ist, dass diese innerhalb eines jeden Schleifendurchlaufs neu ausgewertet wird. Microsoft nennt das „verzögerte Erweiterung von Umgebungsvariablen“; man muss dieses Feature mit dem Befehl
setlocal enabledelayedexpansion
explizit einschalten, wenn man es verwenden will.