Batch: Kopieren wenn Datei nicht existiert
Guten Morgen zusammen,
eigentlich eine einfache Aufgabe, so dachte ich - jedoch funktioniert mein Batch nicht wie es soll- warum?
Problem:
Ich möchte nur jene Dateien aus dem Quellordner kopieren lassen, welche sich NICHT im Zielordner befindet. Mit File-Exist sollte es klappen, jedoch wird trotzdem jede Datei neu kopiert.
Hier mein Code:
Wo ist mein Fehler im Skript?
Danke im Voraus!
eigentlich eine einfache Aufgabe, so dachte ich - jedoch funktioniert mein Batch nicht wie es soll- warum?
Problem:
Ich möchte nur jene Dateien aus dem Quellordner kopieren lassen, welche sich NICHT im Zielordner befindet. Mit File-Exist sollte es klappen, jedoch wird trotzdem jede Datei neu kopiert.
Hier mein Code:
@echo off
set source="\\Netzwerkpfad\Ordner"
set dest="C:\Ordner\Zielordner"
for %%f in (%source%\*) do if not exist "%dest%\%%~nxf" copy "%%f" "%dest%\%%~nxf"
Wo ist mein Fehler im Skript?
Danke im Voraus!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1538718123
Url: https://administrator.de/contentid/1538718123
Ausgedruckt am: 22.11.2024 um 06:11 Uhr
7 Kommentare
Neuester Kommentar
Moin
Ich bin beim Batchen Praktiker der sich die Sachen zusammen sucht und versucht zu verstehen.
Aber mir sieht die For Schleife komisch aus.
Zum anderen, warum nicht ein geniales sehr gutes Tool nutzen das das perfekt beherrscht?
Robocopy
https://www.windowspro.de/wolfgang-sommergut/die-wichtigsten-befehle-von ...
Ich bin beim Batchen Praktiker der sich die Sachen zusammen sucht und versucht zu verstehen.
Aber mir sieht die For Schleife komisch aus.
Zum anderen, warum nicht ein geniales sehr gutes Tool nutzen das das perfekt beherrscht?
Robocopy
https://www.windowspro.de/wolfgang-sommergut/die-wichtigsten-befehle-von ...
Das was Du da vor hast, schreit förmlich nach RoboCopy.
Zumal du dort auch Inkrementelle Backups etc. durchführen kannst.
Das Tool ist Bestandteil von Windows. Somit sind keine weiteren Installationen notwendig.
Beispiele findest Du hier: https://social.technet.microsoft.com/wiki/contents/articles/1073.robocop ...
Wenn Deine Zielsetzung ist, das nur fehlende Dateien kopiert werden, vorhandene Dateien sollen nicht überschrieben oder verändert werden, kann das mit folgender Optionen erreicht werden:
Zumal du dort auch Inkrementelle Backups etc. durchführen kannst.
Das Tool ist Bestandteil von Windows. Somit sind keine weiteren Installationen notwendig.
Beispiele findest Du hier: https://social.technet.microsoft.com/wiki/contents/articles/1073.robocop ...
Wenn Deine Zielsetzung ist, das nur fehlende Dateien kopiert werden, vorhandene Dateien sollen nicht überschrieben oder verändert werden, kann das mit folgender Optionen erreicht werden:
robocopy <Quelle> <Ziel> /xc /xn /xo
Die Anführungszeichen in der Variablendeklaration sind falsch gesetzt.
Setze sie so dann klappt das auch.
Würde dir aber aus Performance-Gründen wie die anderen ebenfalls schon angemerkt haben gleich Robocopy für die diese Allerweltsaufgabe empfehlen.
Setze sie so dann klappt das auch.
set "source=\\Netzwerkpfad\Ordner"
set "dest=C:\Ordner\Zielordner"
Moin @149569,
macht die neue "" Setzung das nicht irrelevant?
Ich kenne "" um mit Leerzeichen verunstaltete Pfade verarbeitbar zu machen.
Bzw für Abgrenzungen von Variablen, aber vor dem Variablen namen damit beginnen sieht für mich wie schon gesagt unwesentlich aus.
Aber wie Ich auch schrieb, Ich habe mir Batch selbst beigebracht und Ich bin kein Skripter.
Was Ich aber auch mehr als einmal feststellen musste ist das "" schnell unsinn herstellen können
Wenn man sagt
sch="wirr"
cd c:\%sch%
Das ergibt dann den nicht aufrufbaren Befehl
cd c:\"sch"
macht die neue "" Setzung das nicht irrelevant?
Ich kenne "" um mit Leerzeichen verunstaltete Pfade verarbeitbar zu machen.
Bzw für Abgrenzungen von Variablen, aber vor dem Variablen namen damit beginnen sieht für mich wie schon gesagt unwesentlich aus.
Aber wie Ich auch schrieb, Ich habe mir Batch selbst beigebracht und Ich bin kein Skripter.
Was Ich aber auch mehr als einmal feststellen musste ist das "" schnell unsinn herstellen können
Wenn man sagt
sch="wirr"
cd c:\%sch%
Das ergibt dann den nicht aufrufbaren Befehl
cd c:\"sch"
Nein, in seinem Code verdoppeln sich die Anführungszeichen in der FOR-Schleife, weil er dort zusätzlich welche setzt.
Vergleiche die Ausgaben hiermit
Ergibt dann folgende Ausgabe
Jetzt solltest du den Unterschied und damit den Fehler seines Codes sehen .
Wenn man also Anführungszeichen innerhalb einer Variablendeklaration nutzt sollte man das Best-Practice also immer so machen:
Dann bekommt man später keine Probleme beim Kombinieren von Pfadbestandteilen weil so die Anführungszeichen selbst nicht in der Variablen landen und man diese später immer hinzufügen kann, man so aber trotzdem spezielle Zeichen in der Variablen platzieren!
Vergleiche die Ausgaben hiermit
@echo off
:: originale Setzung der Anführungszeichen
set source="\\Netzwerkpfad\Ordner"
set dest="C:\Ordner\Zielordner"
echo "%source%"
echo "%dest%"
:: neue Setzung der Anführungszeichen
set "source=\\Netzwerkpfad\Ordner"
set "dest=C:\Ordner\Zielordner"
echo "%source%"
echo "%dest%"
Ergibt dann folgende Ausgabe
""\\Netzwerkpfad\Ordner""
""C:\Ordner\Zielordner""
"\\Netzwerkpfad\Ordner"
"C:\Ordner\Zielordner"
Jetzt solltest du den Unterschied und damit den Fehler seines Codes sehen .
Wenn man also Anführungszeichen innerhalb einer Variablendeklaration nutzt sollte man das Best-Practice also immer so machen:
set "var=Wert"
Ok,
Dein erster Aufruf ist selbsterklärend, das war der Hintergrund den Ich auch meinte.
Ich wußte halt nicht das man die Leerzeichen, die ja nun öfter vorhanden sind, so auch einfängt. Oder andere Sonderzeichen, klar. Aber Ich meide Sonderzeichen, nur an Leerzeichen komme Ich nicht vorbei ..
Wieder etwas sehr praktisches gelernt
Danke
Dein erster Aufruf ist selbsterklärend, das war der Hintergrund den Ich auch meinte.
Ich wußte halt nicht das man die Leerzeichen, die ja nun öfter vorhanden sind, so auch einfängt. Oder andere Sonderzeichen, klar. Aber Ich meide Sonderzeichen, nur an Leerzeichen komme Ich nicht vorbei ..
Wieder etwas sehr praktisches gelernt
Danke