enzephalon
Goto Top

mittels batch dateien kopieren, welche in csv-Datei benannt sind

Hallo

Folgende Problematik:
- in einem Verzeichnis mit diversen Unterverzeichnissen liegen Bilder (zB: AAA_0001.jpg)
- es wird eine CSV-Datei geben in welcher das entsprechende Unterverzeichnis sowie der Dateiname hinterlegt ist (zB: DB_120_10292)
- nun soll eine Batchdatei die CSV-Datei zeilenweise auslesen und die entsprechende Bilddatei in einen anderen Ordner kopieren
- es gibt keine Dupletten bzw gleichnamige Dateien/Verzeichnisse

Zwar habe ich früher mal in Java und anderen Programmiersprachen programmiert, nur ist das lange her.

Würde mich über ein wenig Schützenhilfe freuen!

Danke
EnzephaloN

Content-Key: 85125

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

Printed on: April 19, 2024 at 08:04 o'clock

Member: bastla
bastla Apr 09, 2008 at 18:12:29 (UTC)
Goto Top
Hallo EnzephaloN und willkommen im Forum!

Einige Fragen vorweg:

- Wie ist die Beispielzeile aus der CSV-Datei zu interpretieren - soll das Verzeichnis (Quelle, oder doch Ziel?) "DB_120" und die Datei "10292" heißen, und wie lässt sich der Zusammenhang zu "AAA_0001.jpg" herstellen?

- Gibt es mehrere Unterverzeichnisebenen, oder nur mehrere Unterverzeichnisse des Quellverzeichnisses?
- Liegen auch im Quellverzeichnis Bilddateien?

- Gilt das Ziel "anderer Ordner" für alle Bilder?

Grüße
bastla
Member: EnzephaloN
EnzephaloN Apr 09, 2008 at 18:25:25 (UTC)
Goto Top
Hallo EnzephaloN und willkommen im Forum!

Hallo!

Einige Fragen vorweg:

- Wie ist die Beispielzeile aus der
CSV-Datei zu interpretieren - soll das
Verzeichnis (Quelle, oder doch Ziel?)
"DB_120" und die Datei
"10292" heißen, und wie
lässt sich der Zusammenhang zu
"AAA_0001.jpg" herstellen?

Hier mal zwei Beispielzeilen:
DB_120;AAA_0001.jpg;
DR_110;BAB_0002.jpg;

wobei DB_120 bzw DR_110 das Unterverzeichnis angeben und das andere die Dateinamen sind.


- Gibt es mehrere Unterverzeichnisebenen,
oder nur mehrere Unterverzeichnisse des
Quellverzeichnisses?

Letzteres. Also zum Quellverzeichnis nur ein weiteres Unterverzeichnis

- Liegen auch im Quellverzeichnis
Bilddateien?

Nein, das Quellverzeichnis ist leer.

- Gilt das Ziel "anderer Ordner"
für alle Bilder?

Ja.

Grüße
bastla

Vielen Dank
EnzephaloN
Member: tacker
tacker Apr 09, 2008 at 20:34:31 (UTC)
Goto Top
Guten Abend!

Entschuldigt mich, falls ich mit meinem Lösungsvorschlag völlig daneben liegen sollte - poste ihn denoch einmal!

@Echo Off
For /F "tokens=1,2 delims=;" %%i in (pics.csv) DO CALL :BEARBEITEN %%i %%j  

:BEARBEITEN
SET FOLDER=%1
SET PIC=%2
copy %FOLDER%\%PIC% zielordnername
SET FOLDER=
SET PIC=

so müsste das eigentlich hinhauen, wenn das .cmd file in dem Ordner ausgeführt wird, wo die Unterverzeichnisse darunterliegen! Einfach noch den Zielordnername angeben!

Grüsse tacker
Member: Biber
Biber Apr 09, 2008 at 20:45:44 (UTC)
Goto Top
Hmm,

wenn es die Unterverzeichnisse schon gibt, dann reicht doch folgendes vom CMD-Prompt, oder?
For /F "tokens=1,2 delims=;" %i in (pics.csv) DO Move "%~j" "%~i\%~j"  

Oder übersehe ich etwas?

Grüße
Biber
Member: bastla
bastla Apr 09, 2008 at 21:14:22 (UTC)
Goto Top
@Biber
Oder übersehe ich etwas?
So ganz klar ist die Frage Quell- oder Zielverzeichnis noch nicht beantwortet, aber ich würde es eher so wie tacker sehen - also die Umkehrung Deines Entwurfs (ebenfalls für die Direkteingabe an der Kommandozeile):
For /F "tokens=1,2 delims=;" %i in (pics.csv) DO copy "%~i\%~j" "D:\Zielverzeichnis\">nul  
wobei ich das Zielverzeichnis auch erst erfinden musste.

Wieso in der CSV-Datei nicht gleich ein vollständiger bzw relativer Pfad steht, kann wohl nur EnzephaloN erklären.

Ansonsten noch ein Hinweis: eigentlich sollte kopiert werden ...
@tacker
Also ich sehe überhaupt keinen Grund für eine Entschuldigung ...

Grüße
bastla
Member: Biber
Biber Apr 09, 2008 at 21:24:51 (UTC)
Goto Top
@bastla

Ansonsten noch ein Hinweis: eigentlich sollte kopiert werden ...
Okay, ich habe es jetzt auch nochmal gelesen.
Das "move" hatte ich schon bewusst gewählt, weil ich vom umgekehrten Fall (Wegsortieren AUS einem Sammelsurium-Verzeichnis in irgendwas Strukturiertes) ausging.

Wenn der Sachverhalt aber ist, die jugendfreien Bilder aus den Ordnern 'Urlaub2003' bis 'Urlaub2007' in den Ordner 'FürMutti' zu kopieren, dann ist ein COPY verständlich.

Grüße
Biber
P.S. @tacker
Ich sehe auch überhaupt keinen Grund zum Entschuldigen.
...außerdem... wir geben kein Pardon hier...
Member: EnzephaloN
EnzephaloN Apr 10, 2008 at 12:35:34 (UTC)
Goto Top
Hallo & Danke für Eure Zuschriften.

Ja, es geht ums Kopieren in einen Ordner. Die Problematik ist, daß aus einer Warenwirtschaft eine Artikelliste als XLS exportiert wird und diese bestimmten Artikel sollen dann in ein anderes Verzeichnis kopiert werden. Damit man halt nicht 400 Bilder einzeln suchen muß sondern das einfach automatisiert.
In der XLS-Datei steht die Artikelnummer, aus welcher man das Unterverzeichnis generieren kann und der Artikelname, was der Dateiname ist.

Kann ich jetzt den oben angegebenen und hier nochmal wiederholten Code als funktionabel ansehen?
@Echo Off
For /F "tokens=1,2 delims=;" %%i in (pics.csv) DO CALL :BEARBEITEN %%i %%j  

:BEARBEITEN
SET FOLDER=%1
SET PIC=%2
copy %FOLDER%\%PIC% zielordnername
SET FOLDER=
SET PIC=

EnzephaloN
Member: bastla
bastla Apr 10, 2008 at 12:58:13 (UTC)
Goto Top
Hallo EnzephaloN!

Eine etwas verallgemeinerte bzw gestraffte Version würde so aussehen (die "set"-Zeilen sind natürlich entsprechend anzupassen):
@echo off & setlocal
set "Liste=D:\Deine CSV-Datei.csv"  
set "Basis=D:\Ordner mit Bild-Unterordnern"  
set "Ziel=D:\Dein Zielordner"  

if not exist "%Ziel%" md "%Ziel%"  
for /f "usebackq tokens=1,2 delims=;" %%i in ("%Liste%") do copy "%Basis%\%%~i\%%~j" "%Ziel%\">nul  
Das Testen kann Dir aber keiner abnehmen - bei einem Kopiervorgang in nur ein Zielverzeichnis (und mit einer exemplarischen Liste von zB nur 5 Bildern) ist das aber weder gefährlich noch aufwändig ...

Grüße
bastla
Member: EnzephaloN
EnzephaloN Apr 10, 2008 at 13:04:31 (UTC)
Goto Top
Danke!
Wir werdens später ausprobieren!
Member: flokam
flokam Jul 29, 2008 at 09:53:07 (UTC)
Goto Top
hallo Leute,

ich habe ein ähnliches Problem. ich hab versucht mit diesen Code, aber leider ohne Erfolg.

@echo off & setlocal 


set "Liste=D:\test\bild\Extraktion_BILD_DATEI.csv"   
set "Basis=D:\test\bild\layout"   
set "Ziel=D:\test\kopiert"   

if not exist "%Ziel%" md "%Ziel%"   

for /f "usebackq tokens=1 delims=" %%i in ("%Liste%") do copy "%Basis%\%%~i\%%~j" "%Ziel%\">nul  

kann bitte jemand weiterhelfen?

danke. mfg. flokam
Member: bastla
bastla Jul 29, 2008 at 10:33:18 (UTC)
Goto Top
Hallo flokam!

kann bitte jemand weiterhelfen?
Am ehesten dann, wenn Dein Problem nicht nur "ähnlich", sondern ausreichend beschrieben ist (was insbes den Inhalt Deiner Datei "D:\test\bild\Extraktion_BILD_DATEI.csv" betrifft) ...

Vorweg ist jedenfalls schon festzustellen, dass mit dem Auslesen nur eines "tokens" kein "%%~j" zur Verfügung stehen kann.

Wo es klemmt kannst Du übrigens selbst versuchen festzustellen, indem Du im Batch in Zeile 1 "echo off" auf "echo on" änderst und dann an der Kommandozeile so startest:
"D:\Dein Pfad\Dein Batch.bat" > D:\BatchLog.txt 2>>&1  
In der erstellten Datei "D:\BatchLog.txt" ist dann jeder Schritt des Ablaufes dokumentiert.

Grüße
bastla
Member: flokam
flokam Jul 29, 2008 at 12:49:52 (UTC)
Goto Top
Hallo bastla,

danke für deine schnelle Antwort.
Also, die CSV_Datei sieht dann so aus:
00000\00000933.jpg 
00000\00000934.jpg 
00000\00000935.jpg 
00000\00000936.jpg 
00000\00000937.jpg

die 00000 ist ein Unterverzeichnis. Wenn nötig, kann ich drauf verzichten.
Jetzt mochte ich über diese liste loopen und Dateien die auf z.B. D:\test\layout\00000 liegen
in eine neue Verzeichnis kopieren z.B. D:\test\kopiert

nur zu Info... ich habe nicht viel Ahnung von Batch Programmierung.

danke in Voraus
flokam
Member: bastla
bastla Jul 29, 2008 at 13:11:08 (UTC)
Goto Top
Hallo flokam!

Dann so:
@echo off & setlocal 

set "Liste=D:\test\Extraktion_BILD_DATEI.csv"   
set "Basis=D:\test\layout"   
set "Ziel=D:\test\kopiert"   

if not exist "%Ziel%" md "%Ziel%"   

for /f "usebackq delims=" %%i in ("%Liste%") do copy "%Basis%\%%~i" "%Ziel%\">nul  
Bereits im Zielordner existierende gleichnamige Dateien werden übrigens kommentarlos überschrieben.

Grüße
bastla
Member: flokam
flokam Jul 30, 2008 at 10:04:13 (UTC)
Goto Top
Hallo bastla,

Danke für Deine Hilfe. Es funktioniert super.
Ich hätte noch eine Frage.
Wenn jetzt meine Liste so aussehen würde:
00000\00000933.jpg 
00001\00000934.jpg 
00003\00000935.jpg 
00006\00000936.jpg 
00010\00000937.jpg

und die Bildern in die vorgegebenen Verzeichnis kopiert werden muss, geht dass?
z.B. 00000\00000933.jpg in das Verzeichnis 00000 unter Basis.
Man geht davon aus dass die Verzeichnisse nicht existieren.
wie müsste mein Code dann aussehen?

Grüße, flokam
Member: bastla
bastla Jul 30, 2008 at 10:24:18 (UTC)
Goto Top
Hallo flokam!

Sollte so gehen (wobei ich annehme, dass Du meinst "in das Verzeichnis 00000 unter Ziel"):
@echo off & setlocal 

set "Liste=D:\test\Extraktion_BILD_DATEI.csv"  
set "Basis=D:\test\layout"  
set "Ziel=D:\test\kopiert"   

if not exist "%Ziel%" md "%Ziel%"   

for /f "usebackq delims=" %%i in ("%Liste%") do xcopy /i "%Basis%\%%~i" "%Ziel%\%%~i*">nul  
Grüße
bastla
Member: flokam
flokam Jul 30, 2008 at 10:49:01 (UTC)
Goto Top
Hallo bastla,

VIELEN DANK. Du hast mir sehr geholfen Danke.
Du hast recht, es ging ums Ziel.

wie ich sehe da kommt der xcopy in Spiel und noch das i variable an ziel weiter gegeben oder?
wie gesagt, ich hab wenig Ahnung von Batchdateien. wenn Du noch Lust hast und ist nicht zu viel verlangt, ... kannst Du mir kurz/Grob erklären wie dieses Code funktioniert?

Vielen Dank nochmal

Ciao, flokam
Member: bastla
bastla Jul 30, 2008 at 11:01:11 (UTC)
Goto Top
Hallo flokam!

"xcopy" wird verwendet, damit bei Bedarf das Zielverzeichnis automatisch erstellt wird - "copy" kann das nicht.

Mit dem Schalter "/i" lässt sich verhindern, dass bei nicht-existentem Zielordner die Frage
Ist das Ziel ... ein Dateiname
oder ein Verzeichnisname
(D = Datei, V = Verzeichnis)?
gestellt wird - damit das auch klappt, wenn das Ziel ein Dateiname sein soll, wird an das Ende der Zielangabe noch ein "*" gesetzt.

In "%%~i" steht die aus der csv-Datei eingelesene Zeile ohne umgebende Anführungszeichen - diese setze ich (zur Sicherheit) dann selbst, allerdings um den gesamten Quell- bzw Zielpfad herum.

Grüße
bastla
Member: flokam
flokam Jul 30, 2008 at 11:13:46 (UTC)
Goto Top
Hallo bastla,

ich bedanke mich. (DANKE)
selten bekommt man so eine ausführliche Erklärung. (HILFE 100% erreicht)

Grüße, flokam
Member: Biber
Biber Jul 30, 2008 at 13:43:43 (UTC)
Goto Top
Moin flokam,

eigentlich liegt der von bastla hier eingeführte Standard bei 100,9%.

Aber diese doofe CMD.exe, mit der wir hier die M$-Bätche zusammenschroten, die schneidet immer die Nachkommastellen ab.

Ich schliesse den Beitrag mal.

Grüße
Biber