krautundrueben
Goto Top

Dateien anhand einer Dateiliste kopieren

Hallo zusammen,
ich möchte mehrere in einer Textdatei enthaltenen Dateien anhand des Dateinamens in ein anderes Verzeichnis kopieren .

Folgende Batchdatei funktioniert , wenn die Dateinamen im Verzeichnis und die Namen in der Textdatei absolut identisch sind.

@echo off & setlocal

set "sourceRoot=j:\ichselber"
set "sourceList=j:\List.txt"
set "destFolder=e:\Ziel"

for /f "delims=" %%i in ('dir /a-d /b /s "%sourceRoot%\*.txt"^|findstr /ig:"%sourceList%"') do (
copy "%%~i" "%destFolder%\"
)


Jetzt haben aber die Namen in der Textdatei abgekürzte Namen.

Beispiel: der Name der Datei heisst 1234-hurra4567-89.txt
der Name in der Liste heisst hurra4567

Die Teile vor dem Bindestrich und hinter dem Bindestrich sind bei allen Dateien gleich.
Es sollen also anhand des "Mittelteils" die Dateien kopiert werden.

Ich vermute es lässt sich mit "token" und "delim" realisieren, bekomme es aber nicht hin.

Kann mir irgendwer vielleicht einen Tipp geben ?

Content-Key: 370501

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

Printed on: April 26, 2024 at 04:04 o'clock

Member: Friemler
Solution Friemler Apr 08, 2018 updated at 17:59:40 (UTC)
Goto Top
Hallo,

Teste mal folgendes:

@echo off & setlocal

set "sourceRoot=j:\ichselber"  
set "sourceList=j:\List.txt"  
set "destFolder=e:\Ziel"  

for /r "%sourceRoot%" %%a in ("*.txt") do (  
  for /f "tokens=2 delims=-" %%b in ("%%~nxa") do (  
    for /f "usebackq delims=" %%c in ("%sourceList%") do (  
      if /i "%%b" equ "%%~c" (  
        copy "%%~a" "%destFolder%\" > NUL  
      )
    )
  )
)

Bei Interesse und/oder Fragen zu obigem Code kannst Du mein Tutorial zur FOR-Schleife durcharbeiten.

Grüße
Friemler
Member: KrautundRueben
KrautundRueben Apr 08, 2018 at 12:27:06 (UTC)
Goto Top
Hallo,
zunächst ein Dankeschön für die Hilfestellung.

Das angegebene Script funktioniert irgendwie noch nicht. Wenn ich Echo off ausschalte, dann werden mir sämtliche Zeilen ausgegeben aber es werden keine Dateien kopiert. NUL habe ich auch entfernt.
Member: Friemler
Friemler Apr 08, 2018 at 12:36:39 (UTC)
Goto Top
Funktioniert hier bei mir problemlos. Sind die Pfade korrekt gesetzt?

Da Du ECHO OFF bereits auskommentiert hast, kann ich Dir nur noch raten das Script aus einer Konsole heraus zu starten und seine Ausgaben zu analysieren.

Grüße
Friemler
Member: KrautundRueben
KrautundRueben Apr 08, 2018 at 13:20:22 (UTC)
Goto Top
Hallo nochmal, ich habe mal etwas rumgeforscht.
Dein Script funktioniert wirklich wunderbar. Das Problem liegt bei mir darin, das ich in dem verschachtelten Verzeichnispfad einen Bindestrich habe.
Das sorgt für Ärger, ändere ich den Pfad ab ohne Bindestrich, dann lauft die Batchdatei einwandfrei durch.

Nochmals herzlichen Dank für Deine schnelle Hilfe.

Gruß
KrautundRueben
Member: Friemler
Solution Friemler Apr 08, 2018 updated at 13:31:40 (UTC)
Goto Top
Sorry, daran hätte ich von Anfang an denken können...

Ich habe das Script oben abgeändert, sodass in der (zweiten) FOR-Schleife, die den relevanten Teil des Dateinamens extrahiert, wirklich nur noch der Dateiname inkl. Erweiterung als Ausgangsbasis verwendet wird.

Grüße
Friemler
Member: KrautundRueben
KrautundRueben Apr 08, 2018 at 17:42:11 (UTC)
Goto Top
Guten Abend Friemler,
hast Du deine abgeänderte Version deines Scripts selber getestet ? Deine abgeänderte Version ist bei mir ohne Funktion und es wird nichts kopiert. Die 1.Version von Dir klappt einwandfrei. An den Pfadangaben habe ich nichts geändert.
Member: Friemler
Solution Friemler Apr 08, 2018 at 17:57:18 (UTC)
Goto Top
Ich habe den Code gerade getestet - funktioniert.

Was ich allerdings von Anfang an übersehen habe war, dass Du in Deinem Eröffnungsposting beim DIR-Befehl die Option /S verwendet hattest (rekursive Verarbeitung des angegebenen Verzeichnisses und aller Unterverzeichnisse).

Möglicherweise hast Du das nur getan, um vom DIR-Befehl vollständige Pfade zu bekommen. Ich habe jedenfalls mein Script oben nochmals abgeändert, um auch damit eine rekursive Verarbeitung der Verzeichnisstruktur zu erreichen.

Grüße
Friemler