Per Batch Dateinamen prüfen und Datei kopieren
Hallo zusammen,
folgendes Problem hab ich zu lösen, und nicht wirklich eine Ahnung wo (und vorallem wie) ich anfangen soll ;)
Ich habe eine Excel Liste mit ca. 800 Dateinamen (z.B. M123456). Diese Dateinamen sind im Netzwerk auf dem Fileserver in den unterschiedlichsten Ordnern als PDF Dateien abgelegt.
Ich muss nun alle diese Dateien aus den Verzeichnissen herauskopieren und in ein eigenes Verzeichniss ablegen.
xcopy kenne ich, aber wie bringe ich dem batch bei alle unterverzeichnisse zu durchsuchen?
Danke für Eure Bemühungen.
Gruss rekrut
folgendes Problem hab ich zu lösen, und nicht wirklich eine Ahnung wo (und vorallem wie) ich anfangen soll ;)
Ich habe eine Excel Liste mit ca. 800 Dateinamen (z.B. M123456). Diese Dateinamen sind im Netzwerk auf dem Fileserver in den unterschiedlichsten Ordnern als PDF Dateien abgelegt.
Ich muss nun alle diese Dateien aus den Verzeichnissen herauskopieren und in ein eigenes Verzeichniss ablegen.
xcopy kenne ich, aber wie bringe ich dem batch bei alle unterverzeichnisse zu durchsuchen?
Danke für Eure Bemühungen.
Gruss rekrut
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 66714
Url: https://administrator.de/forum/per-batch-dateinamen-pruefen-und-datei-kopieren-66714.html
Ausgedruckt am: 13.01.2025 um 08:01 Uhr
10 Kommentare
Neuester Kommentar
Hallo rekrut und willkommen im Forum!
Du könntest es mit folgende Vorgangsweise versuchen:
Zunächst aus Excel die Dateiliste mit "Datei/Speichern unter..." mit dem Dateityp "CSV(Trennzeichen-getrennt)" in eine Textdatei (D:\Dateien.txt) speichern. Wenn die Liste nur die Dateinamen enthält, sollte sie eigentlich ohnehin nur eine Spalte umfassen - falls es zusätzliche Spalten gibt, diese vor dem Speichern löschen.
Danach mit der folgenden Batch-Datei eine Liste aller gespeicherten pdf-Dateien (im Beispiel für die Laufwerke D: und E: - ev weitere nach dem gleichen Schema wie für E: hinzufügen ) erstellen (damit nicht für jede der 800 Dateien immer die gesamten Laufwerke durchsucht werden müssen), die aus Excel gespeicherte Liste der Dateien durchgehen, in der PDF-Liste für jede Datei den Dateipfad suchen, und anhand des Pfades die Datei in ein Sammelverzeichnis kopieren:
Aufgrund Deines Beispieles (M123456) bin ich davon ausgegangen, dass in der Excel-Liste der reine Namensbestandteil (also ohne den Typ .pdf) gespeichert ist - sollte dem nicht so sein, muss die erste "for"-Zeile so aussehen:
Zusätzlich wird in einer Protokolldatei der vollständige Pfad der kopierten Dateien festgehalten.
Eine Anmerkung: Wenn mehrere gleichnamige Dateien in der PDF-Liste aufscheinen, wird nur die letzte dieser Dateien kopiert (da ja ohnehin für das Sammelverzeichnis gilt: Es kann nur eine geben ...).
Grüße
bastla
Du könntest es mit folgende Vorgangsweise versuchen:
Zunächst aus Excel die Dateiliste mit "Datei/Speichern unter..." mit dem Dateityp "CSV(Trennzeichen-getrennt)" in eine Textdatei (D:\Dateien.txt) speichern. Wenn die Liste nur die Dateinamen enthält, sollte sie eigentlich ohnehin nur eine Spalte umfassen - falls es zusätzliche Spalten gibt, diese vor dem Speichern löschen.
Danach mit der folgenden Batch-Datei eine Liste aller gespeicherten pdf-Dateien (im Beispiel für die Laufwerke D: und E: - ev weitere nach dem gleichen Schema wie für E: hinzufügen ) erstellen (damit nicht für jede der 800 Dateien immer die gesamten Laufwerke durchsucht werden müssen), die aus Excel gespeicherte Liste der Dateien durchgehen, in der PDF-Liste für jede Datei den Dateipfad suchen, und anhand des Pfades die Datei in ein Sammelverzeichnis kopieren:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off & setlocal
dir /s /b D:\*.pdf>D:\Liste.txt
dir /s /b E:\*.pdf>>D:\Liste.txt
if not exist D:\Sammelverzeichnis md D:\Sammelverzeichnis
if exist D:\Protokoll.txt del D:\Protokoll.txt
for /f "delims=" %%i in (D:\Dateien.txt) do call :ProcessFile "%%i.pdf"
goto :eof
:ProcessFile
for /f "delims=" %%d in ('findstr /e /i "%~1" D:\Liste.txt') do set "Pfad=%%d"
echo %Pfad%>>D:\Protokoll.txt
copy "%Pfad%" D:\Sammelverzeichnis>nul
goto :eof
1
for /f "delims=" %%i in (D:\Dateien.txt) do call :ProcessFile "%%i"
Eine Anmerkung: Wenn mehrere gleichnamige Dateien in der PDF-Liste aufscheinen, wird nur die letzte dieser Dateien kopiert (da ja ohnehin für das Sammelverzeichnis gilt: Es kann nur eine geben ...).
Grüße
bastla
Hallo rekrut!
Dann eben ohne den Schalter "/e" beim "findstr":
Den genannten Schalter (zur Suche am Ende des Pfades) hatte ich aus Sicherheitsgründen gesetzt, damit wirklich nur eine Übereinstimmung mit einem Dateinamen, und nicht ev auch mit dem Namen eines Verzeichnisses, in dem dann aber eine ganz andere pdf-Datei liegt, möglich wäre (auch wenn es vermutlich eher selten Verzeichnisnamen mit dem Zusatz ".pdf" gibt).
Nur zur Sicherheit: In der Excelliste steht am Ende des Dateinamens kein ".pdf"? Falls nämlich doch, hätten wird jetzt das umgekehrte Problem, diesen Teil vor dem Vergleichen abschneiden zu müssen ...
Grüße
bastla
P.S.: Geposteter Programmcode wird übrigens (wie ich meine) leserlicher, wenn er zwischen < code> und < /code> (jeweils ohne Leerzeichen) steht ...
Dann eben ohne den Schalter "/e" beim "findstr":
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@echo off & setlocal
dir /s /b /a-d D:\data\_PDF\*.pdf>D:\Liste.txt
if not exist D:\Sammelverzeichnis md D:\Sammelverzeichnis
if exist D:\Protokoll.txt del D:\Protokoll.txt
for /f "delims=" %%i in (D:\Dateien.txt) do call :ProcessFile "%%i"
pause
goto :eof
:ProcessFile
for /f "delims=" %%d in ('findstr /i "%~1" D:\Liste.txt') do set "Pfad=%%d"
echo %Pfad%>>D:\Protokoll.txt
copy "%Pfad%" D:\Sammelverzeichnis>nul
goto :eof
Nur zur Sicherheit: In der Excelliste steht am Ende des Dateinamens kein ".pdf"? Falls nämlich doch, hätten wird jetzt das umgekehrte Problem, diesen Teil vor dem Vergleichen abschneiden zu müssen ...
Grüße
bastla
P.S.: Geposteter Programmcode wird übrigens (wie ich meine) leserlicher, wenn er zwischen < code> und < /code> (jeweils ohne Leerzeichen) steht ...