sinzal
Goto Top

Batch: Dateien in einen Ordner verschieben, wenn sie im Zielordner nicht schon vorhanden sind

Hallo Leute,

ich bin neu im Forum und versuche mich an meiner ersten Frage. Bitte habt etwas Nachsicht, wenn ich mich umständlich ausdrücke.

Ich möchte ein Batch-Skript schreiben, das Dateien aus einem lokalen Ordner eines Notebooks auf einen Ordner auf einem freigegebenen Netzlaufwerk verschiebt (zum Archivieren). Im Quellverzeichnis sind beliebig viele Dateien mit unterschiedlichsten Namen und verschiedensten Dateitypen (z.B. DOCX, DOC, XLS, TXT, ZIP, EXE, BAT) vorhanden. Auf dem Zielverzeichnis ebenso. Leider kommt es vor, dass auf dem Zielverzeichnis Dateien schon vorhanden sind, die denselben Dateinamen wie Dateien im Quellverzeichnis haben. Diese sollen nicht verschoben werden, damit ich manuell kontrollieren kann, welche Version der betroffenen Dateien die aktuellste ist. Alle noch nicht im Zielverzeichnis vorhandenen Dateien sollen verschoben werden.

Ich habe Code gefunden, um Dateien dann zu verschieben, wenn die schon im Zielverzeichnis vorhanden sind:
for /f "usebackq Delims=" %%i IN (`dir l:\ziel\*.* /s /b /ad`) do (move c:\quelle\"%%i" l:\ziel\)  

In ähnlicher Art wollte ich einen Befehl nutzen, bei dem geprüft wird, ob die Dateinamen noch nicht bei der von dir ausgegebenen Liste enthalten sind.
for /f "usebackq Delims=" %%i not IN (`dir l:\ziel\*.* /s /b /ad`) do (move c:\quelle\"%%i" l:\ziel\)  

Jedoch funktioniert der Befehl mit dem eingefügten not nicht.
Weiß jemand einen alternativen Befehl, ein Skript oder eine Möglichkeit, meinen bisherigen Befehl lauffähig zu machen?

Viele Grüße,
Sinzal

Content-Key: 276619

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

Ausgedruckt am: 29.03.2024 um 12:03 Uhr

Mitglied: ArnoNymous
ArnoNymous 07.07.2015 um 11:21:42 Uhr
Goto Top
Schau dir mal Robocopy und die Parameter /XN /XC /XO an.
Mitglied: SeaStorm
SeaStorm 07.07.2015 um 11:22:02 Uhr
Goto Top
robocopy ist dein Freund. Damit kannst du sowas ganz einfach automatisch erledigen. ( also das er nur Dateien überschreibt, die älter sind als die Quellversion )
Mitglied: Sinzal
Sinzal 07.07.2015 um 12:43:31 Uhr
Goto Top
Vielen Dank für die Hinweise. Robocopy mit den Parametern /MOV /XN /XC /XO wäre praktisch etwas, das ich einsetzen könnte.
Zusätzlich gibt es aber noch eine Anforderung, dass einige Dateien abhängig von den ersten Buchstaben im Dateinamen in bestimmte Unterverzeichnisse im Zielverzeichnis verschoben werden sollen. Mit dem normalen Copy- oder Move-Befehl hatte dies funktioniert:
move c:\quelle\abc*.* l:\ziel\abc\
(Im Beispiel: Verschieben aller Dateien, die mit "abc" beginnen. Allerdings werden hierbei auch die ggf. neueren Dateien am Ziel überschrieben.)
Gibt es für diese das Verschieben aller Dateien, deren Dateinamen mit einer bestimmten Buchstabenfolge beginnt (z.B. "abc") eine Entsprechung im Robocopy? Dann könnte ich das Tool super nutzen.
Vielen Dank schonmal.
Sinzal
Mitglied: SeaStorm
SeaStorm 07.07.2015 aktualisiert um 12:56:41 Uhr
Goto Top
nein robocopy kann nur Dateien per Filter vom Prozess ausschliessen.
Mitglied: bastla
Lösung bastla 07.07.2015, aktualisiert am 08.07.2015 um 08:57:01 Uhr
Goto Top
Hallo Sinzal und willkommen im Forum!

Da sollte doch ein if not exist genügen (ungetestet):
for /f "Delims=" %%i IN ('dir /b/ad c:\quelle') do if not exist "l:\ziel\%%i" move "c:\quelle\%%i" l:\ziel\
Grüße
bastla
Mitglied: Sinzal
Sinzal 08.07.2015 um 08:56:30 Uhr
Goto Top
Hallo Leute,

Vielen Dank für Eure Tipps!

@bastla: Ich habe deinen Code etwas modifiziert und bin jetzt zufrieden. Vielen Dank.

Der von mir verwendete Code sieht jetzt wie folgt aus:
cd c:\quelle
for /f "Delims=" %%i IN ('dir abc*.* /b') do (if not exist "l:\ziel\%%i" (move "c:\quelle\%%i" l:\ziel))  

Viele Grüße,
Sinzal
Mitglied: bastla
bastla 08.07.2015 um 12:19:34 Uhr
Goto Top
Hallo Sinzal!

Ist so aber nicht Fisch, nicht Fleisch - wenn Du schon den Quellpfad "herausnehmen" möchtest, dann konsequenter Weise auch beim move - also etwa:
cd /d c:\quelle
for /f "delims=" %%i in ('dir /b abc*.*') do if not exist "l:\ziel\%%i" move "%%i" l:\ziel  
Alternativ Quelle und Ziel als Variablen (würde ich grundsätzlich empfehlen, außer bei wirklich überschaubaren Batches wie diesem Einzeiler):
set "Quelle=c:\quelle"  
set "Ziel=I:\Ziel"  
set "Dateien=abc"  

for /f "delims=" %%i in ('dir /b "%Quelle%\%Dateien%*.*"') do if not exist "%Ziel%\%%i" move "%Quelle%\%%i" "%Ziel%"  
Grüße
bastla