Batch Datei soll PDF-Dateien aus einer beschreibenden CSV-Datei in einen neuen Ordner kopieren, wobei der bezeichnende Text mitten im Namen der PDF steht
Hallo,
ich hoffe, ich habe den Titel richtig gewählt. Ich möchte folgendes erreichen:
Es ist eine .csv-Datei vorhanden. Diese hat den Aufbau "123456;3; [neue Zeile]234567;3"... . Passend dazu habe ich .pdf-Dateien, welche folgendermaßen aufgebaut sind: blabla123456blabla.pdf oder blabla234567blabla.pdf.
Jetzt soll mir eine Batch-Datei die Arbeit abnehmen, die Dateien 123456 sowie 234567 in einen neuen Ordner, hier: 3, zu kopieren. Folgende Schwierigkeit besteht noch: Die PDF's können vom Startverzeichnis (ich nenne es mal \start) in weiteren Unterordnern vorhanden sein (z.B. Start\QuartalI\ etc.).
Wie bekomme ich es also hin, dass "tief" gesucht wird und dann ein kopieren stattfindet?
Danke schonmal vorab für die Hilfe!
ich hoffe, ich habe den Titel richtig gewählt. Ich möchte folgendes erreichen:
Es ist eine .csv-Datei vorhanden. Diese hat den Aufbau "123456;3; [neue Zeile]234567;3"... . Passend dazu habe ich .pdf-Dateien, welche folgendermaßen aufgebaut sind: blabla123456blabla.pdf oder blabla234567blabla.pdf.
Jetzt soll mir eine Batch-Datei die Arbeit abnehmen, die Dateien 123456 sowie 234567 in einen neuen Ordner, hier: 3, zu kopieren. Folgende Schwierigkeit besteht noch: Die PDF's können vom Startverzeichnis (ich nenne es mal \start) in weiteren Unterordnern vorhanden sein (z.B. Start\QuartalI\ etc.).
Wie bekomme ich es also hin, dass "tief" gesucht wird und dann ein kopieren stattfindet?
Danke schonmal vorab für die Hilfe!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 95381
Url: https://administrator.de/forum/batch-datei-soll-pdf-dateien-aus-einer-beschreibenden-csv-datei-in-einen-neuen-ordner-kopieren-wobei-der-95381.html
Ausgedruckt am: 22.04.2025 um 06:04 Uhr
6 Kommentare
Neuester Kommentar
Hallo wigald00!
Welche Rahmenbedingungen sind dabei zu beachten? Es könnte zB passende Dateien in mehreren Ordnern geben, der Suchstring nicht eindeutig sein (bei einer Suche nach "blabla123456blabla.pdf" würde zB auch "blabla012345678blabla.pdf" gefunden), insbes da kopiert und nicht verschoben werden soll: eine gleichnamige Datei bereits im Zielordner vorhandenen sein, ...
Im einfachsten Fall (nur die erste gefundene Datei wird kopiert und überschreibt eine gleichnamige Datei im Zielordner) könnte das jedenfalls so aussehen:
Zum Testen steht vor dem "copy" ein "echo" - damit wird der Kopierbefehl nur angezeigt, aber noch nicht ausgeführt; wenn Du das "echo" entfernst, wird kopiert (und ggf ohne Rückfrage im Zielordner überschrieben).
Grüße
bastla
Welche Rahmenbedingungen sind dabei zu beachten? Es könnte zB passende Dateien in mehreren Ordnern geben, der Suchstring nicht eindeutig sein (bei einer Suche nach "blabla123456blabla.pdf" würde zB auch "blabla012345678blabla.pdf" gefunden), insbes da kopiert und nicht verschoben werden soll: eine gleichnamige Datei bereits im Zielordner vorhandenen sein, ...
Im einfachsten Fall (nur die erste gefundene Datei wird kopiert und überschreibt eine gleichnamige Datei im Zielordner) könnte das jedenfalls so aussehen:
@echo off & setlocal
set "CSV=D:\Deine.csv"
set "Basis=D:\Basisordner"
set "Ziel=D:\Zielordner"
if not exist "%Ziel%" md "%Ziel%" || (echo "%Zielordner%" konnte nicht erstellt werden! & goto :eof)
set done=
for /f "usebackq tokens=1-2 delims=;" %%i in ("%CSV%") do for /f "delims=" %%a in ('dir /s /b "%Basis%\*%%i*.pdf" 2^>nul') do if not defined done echo copy "%%a" "%Ziel%\%%j\" && set done=true
Grüße
bastla
Hallo wigald00!
So ganz genau verstehe ich leider Dein zusätzliches Vorhaben nicht ...
Bisher ist es so, dass es (durch die Liste in der CSV-Datei) eine eindeutige Zuordnung zwischen Namensbestandteil und Zielordner gibt - dabei ist %%j jeweils nur für die gerade verarbeitete Zeile der CSV-Datei gültig.
Andererseits kennst Du ja den Pfad zu den Verzeichnissen ohnehin, sodass nur die Frage offen bleibt, welches der Verzeichnisse das Ziel für die neue Kopieraktion sein soll - den Zusammenhang mit dem bisherigen Ablauf kann ich leider nicht erkennen.
Außerdem: Was wäre der Inhalt von %PdfAlle%?
Magst Du das Ganze noch etwas konkreter darstellen?
Grüße
bastla
So ganz genau verstehe ich leider Dein zusätzliches Vorhaben nicht ...
Bisher ist es so, dass es (durch die Liste in der CSV-Datei) eine eindeutige Zuordnung zwischen Namensbestandteil und Zielordner gibt - dabei ist %%j jeweils nur für die gerade verarbeitete Zeile der CSV-Datei gültig.
Andererseits kennst Du ja den Pfad zu den Verzeichnissen ohnehin, sodass nur die Frage offen bleibt, welches der Verzeichnisse das Ziel für die neue Kopieraktion sein soll - den Zusammenhang mit dem bisherigen Ablauf kann ich leider nicht erkennen.
Außerdem: Was wäre der Inhalt von %PdfAlle%?
Magst Du das Ganze noch etwas konkreter darstellen?
Grüße
bastla
Hallo wigald00!
Die "for /d"-Schleife geht alle unterhalb von %Ziel% liegenden Verzeichnisse durch und verwendet diese (%%i) als Ziel des Kopiervorganges.
Mit "xcopy /y" kannst Du die Sicherheitsabfrage hinsichtlich des Überschreibens bereits vorhandener Zieldateien unterbinden, und der Schalter "/d" würde zB nur Dateien kopieren, die im Zielverzeichnis nicht vorhanden oder die jünger als im Zielverzeichnis bereits vorhandene Versionen sind.
Grüße
bastla
Dann gibt es noch 20 übergreifende PDF's, die in genau einem Verzeichnis abgelegt sind, die dann jeweils in die Unterordner (1-8) kopiert werden sollen
Das würde ich allerdings nicht mit den anderen Kopien vermengen, da ansonsten das Kopieren für jede Zeile der CSV-Datei (und damit vermutlich für die meisten Ordner mehr- bis vielfach) erfolgen würde - einfacher wäre, am Ende anzufügen:for /d %%i in ("%Ziel%\*.*") do xcopy "%PdfAlle%\*.pdf" "%%i\">nul
Mit "xcopy /y" kannst Du die Sicherheitsabfrage hinsichtlich des Überschreibens bereits vorhandener Zieldateien unterbinden, und der Schalter "/d" würde zB nur Dateien kopieren, die im Zielverzeichnis nicht vorhanden oder die jünger als im Zielverzeichnis bereits vorhandene Versionen sind.
Grüße
bastla