robdox
Goto Top

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:

@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!

Content-ID: 1538718123

Url: https://administrator.de/contentid/1538718123

Ausgedruckt am: 22.11.2024 um 06:11 Uhr

TomTomBon
TomTomBon 22.11.2021 um 09:36:03 Uhr
Goto Top
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
face-smile
https://www.windowspro.de/wolfgang-sommergut/die-wichtigsten-befehle-von ...
wobit94
wobit94 22.11.2021 um 10:27:05 Uhr
Goto Top
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:

robocopy <Quelle> <Ziel> /xc /xn /xo
149569
149569 22.11.2021 aktualisiert um 10:32:15 Uhr
Goto Top
Zitat von @robdox:
Wo ist mein Fehler im Skript?
Die Anführungszeichen in der Variablendeklaration sind falsch gesetzt.
Setze sie so dann klappt das auch.
set "source=\\Netzwerkpfad\Ordner"  
set "dest=C:\Ordner\Zielordner"  
Würde dir aber aus Performance-Gründen wie die anderen ebenfalls schon angemerkt haben gleich Robocopy für die diese Allerweltsaufgabe empfehlen.
TomTomBon
TomTomBon 22.11.2021 um 17:04:08 Uhr
Goto Top
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 face-wink
Wenn man sagt
sch="wirr"
cd c:\%sch%
Das ergibt dann den nicht aufrufbaren Befehl
cd c:\"sch"
149569
Lösung 149569 22.11.2021 aktualisiert um 17:25:10 Uhr
Goto Top
Zitat von @TomTomBon:

Moin @149569,
macht die neue "" Setzung das nicht irrelevant?
Nein, in seinem Code verdoppeln sich die Anführungszeichen in der FOR-Schleife, weil er dort zusätzlich welche setzt.

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 face-wink.

Wenn man also Anführungszeichen innerhalb einer Variablendeklaration nutzt sollte man das Best-Practice also immer so machen:
set "var=Wert"  
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!
TomTomBon
TomTomBon 23.11.2021 um 08:03:39 Uhr
Goto Top
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 .. face-wink

Wieder etwas sehr praktisches gelernt face-smile

Danke
robdox
robdox 24.11.2021 um 17:56:51 Uhr
Goto Top
Super ich danke euch allen!