any-key
Goto Top

Batch Script - Dateien nach Namen in Ordner Sortieren und umbennen

Eine Liste von Bilddateien soll in eine vorgegeben Ordnerstruktur kopiert werden und dann umbenannt werden in Abhängigkeit vom Dateinamen.

Hallo Batch Scripter,

ich habe einige Bilddateien, die in eine vorgegebene Ordnerstruktur kopiert werden müssen.

Die Struktur sieht in etwa so aus:

Alter NameOrdner Neuer Name
Bild_A01f01d0.tifW A01Null - n00.tif
Bild_A01f01d1.tifW A01Eins - n00.tif
Bild_A01f02d0.tifW A02Null - n00.tif
Bild_A01f02d1.tifW A02Eins - n00.tif
Bild_A02f01d0.tifW B01Null - n00.tif
Bild_A02f01d1.tifW B01Eins - n00.tif
Bild_A02f02d0.tifW B02Null - n00.tif
Bild_A02f02d1.tifW B02Eins - n00.tif

Die Dateien Bild_A01.. A02..A03...liegen alle im gleichen Hauptordner und sollen dann abhängig vom Namen in den entsprechenden Unterordner kopiert werden.
Also z.B. A01f01 in Order "W A01" und A01f02 in "W A02", hingegen A02f02 in "W B02" oder A04f05 in Order "W D05".

Die entsprechenden Unterordner sind schon vorhanden und in diesen liegen bereits Bilder, die den neuen Namen tragen. Diese sollen gelöscht werden und die kopierten Bilder sollen deren Namen bekommen, der immer gleich ist, mit Ausnahme des Anfangs, der von der letzen Ziffer im alten Dateinamen abhängig ist. Die Ordennamen und Bildernamen reichen von "W A01" - "W A12" bis "W H01" - "W H12". Also insgesamt 96 Unterordner, wobei es nicht immer alle 96 gibt.

Ich habe leider keine Ahnung von shell-scripten und wäre für Hilfe sehr dankbar.

vielen Dank. any-key
Kommentar vom Moderator Biber am Jun 17, 2010 um 19:04:09 Uhr
Zitat von @any-key:
Batch Script - Dateien nach Namen in Ordner Sortieren und umbennen
Ich weiss nicht.... macht ihr das wirklich unabsichtllch?
Kann doch eigentlich nicht sein, dass es nie richtig geschrieben wird...

Content-Key: 145082

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

Printed on: April 27, 2024 at 00:04 o'clock

Member: bastla
bastla Jun 17, 2010 at 16:09:49 (UTC)
Goto Top
Hallo any-key und willkommen im Forum!

Wenn ich die Struktur richtig interpretiere, sollte das etwa so zu machen sein (ungetestet):
@echo off & setlocal
set "Hauptordner=D:\Bilder"  

set C=%temp%\ConvertFilename.vbs
>%C% echo D=WScript.Arguments(0):T=Array("Null","Eins"):B=Chr(CInt(Mid(D,7,2))+64):N=Mid(D,10,2):WScript.Echo "W "^&B^&N^&"_"^&T(Mid(D,13,1))^&" - n00.tif"  

pushd "%Hauptordner%"  
for /f %%i in ('dir Bild_*.tif') do for /f "tokens=1-2 delims=_" %%a in ('cscript //nologo %C% %%i') do copy %%i "%%a\%%b"  
popd

Grüße
bastla
Member: any-key
any-key Jun 21, 2010 at 17:23:33 (UTC)
Goto Top
Hallo bastla,

danke erstmal fürs Willkommen heißen und noch viel mehr für Deinen Lösungsansatz.

Die Lösung sieht für mich als nicht-programmierer sehr elegant aus und hat mich einige Zeit gekostet zu durchblicken.
Leider bricht das Script mit der Fehlermeldung Type Mismatch: 'Cint' und Type Mismatch: 'Mid' in Zeile 1,47 bzw. Zeile 1,88 ab.
Wenn ich diese Fehlermeldung richtig verstehe, erkennt das Script keine Zahlen an diesen Positionen, die aber im Dateinamen da sind.

Noch eine vielleicht triviale Frage, aber wenn ich mir die Ausgabe vorher anschauen möchte, reicht es dann "copy" durch "echo" zu ersetzen oder wie würde man das realisieren?

tausend dank.

Grüße, any-key

PS: @Biber: Sorry für den Vertipper, kann man das noch ändern?
Member: Biber
Biber Jun 21, 2010 at 20:04:28 (UTC)
Goto Top
Moin any-key,

Vertipper sind hier gern gesehene Mitglieder... face-wink

Grundsätzlich kann du immer hinterher den Beitrag (oder einen Kommentar) editieren, wenn du angemeldet bist und "Editieren" auswählst.
bei Tippfehlern, auf die schon jemand Bezug genommen hat, ist es in der Regel zu spät face-wink

A propos Tippfehler...

bastla hat die auch einen zum Debuggen überlassen... bei der DIR-Anweisung in Zeile 8 fehlt der Parameter /B.
Der bewirkt, dass nur die Pfad/Dateinamen vom DIR-Befehl angezeigt werden, nicht die Header ("Volume in Laufwerk D heißt..." und Zusammenfassung ("X Dateien in Y Verzeichnissen")

Wenn du mit em ECHO-Befehl ein "was-wäre-wenn" simulieren willst, dann wäre meine Empfehlung:

:: bastlasFilesorter.cmd
@echo off & setlocal
set "Hauptordner=F:\Schnipsel"  

set C=%temp%\ConvertFilename.vbs
>%C% echo D=WScript.Arguments(0):T=Array("Null","Eins"):B=Chr(CInt(Mid(D,7,2))+64):N=Mid(D,10,2):WScript.Echo "W "^&B^&N^&"_"^&T(Mid(D,13,1))^&" - n00.tif"  

pushd "%Hauptordner%"  
for /f %%i in ('dir /b Bild_*.tif') do ECHO for /f "tokens=1-2 delims=_" %%a in ('cscript //nologo %C% %%i') do ....nothing  
for /f %%i in ('dir /b Bild_*.tif') do for /f "tokens=1-2 delims=_" %%a in ('cscript //nologo %C% %%i') do ECHO copy %%i "%%a\%%b"  

popd

--> So [mit den Codezeilen 08/09] lasse ich ZWEI FOR-Anweisungen, die bei bastla in EINER Zeile stehen, nacheinander anzeigen.
Eingefügt ist das GROSSgeschriebene ECHO.

Ausgabe bei mir wäre in etwa:
for /f "tokens=1-2 delims=_" %a in ('cscript //nologo C:\DOKUME~1\Biber\LOKALE~1\Temp\ConvertFilename.vbs Bild_A01f01d1.tif') do ....nothing
for /f "tokens=1-2 delims=_" %a in ('cscript //nologo C:\DOKUME~1\Biber\LOKALE~1\Temp\ConvertFilename.vbs Bild_A02f02d1.tif') do ....nothing
for /f "tokens=1-2 delims=_" %a in ('cscript //nologo C:\DOKUME~1\Biber\LOKALE~1\Temp\ConvertFilename.vbs Bild_A02f02d0.tif') do ....nothing
copy Bild_A01f01d1.tif "W A01\Eins - n00.tif"
copy Bild_A02f02d1.tif "W B02\Eins - n00.tif"
copy Bild_A02f02d0.tif "W B02\Null - n00.tif"
... bei den drei Testdateien, die ich mir angelegt habe.

Nähere Details kommen ggf. von bastla (falls er mich noch nicht überholt hat)

Grüße
Biber
Member: bastla
bastla Jun 21, 2010 at 20:05:33 (UTC)
Goto Top
Hallo any-key!

Ich hatte zum Testen Deine Beispiele verwendet und die gewünschten Ergebnisse erhalten - direkt von der Kommandozeile nachzuvollziehen mit
D:\>for %i in (Bild_A01f01d0.tif Bild_A01f01d1.tif Bild_A01f02d0.tif Bild_A01f02d1.tif Bild_A02f01d0.tif Bild_A02f01d1.tif Bild_A02f02d0.tif Bild_A02f02d1.tif) do @cscript //nologo %temp%\ConvertFilename.vbs %i
W A01_Null - n00.tif
W A01_Eins - n00.tif
W A02_Null - n00.tif
W A02_Eins - n00.tif
W B01_Null - n00.tif
W B01_Eins - n00.tif
W B02_Null - n00.tif
W B02_Eins - n00.tif
Wie Du sicher schon den "Mid"-Teilen entnommen hast, werden die Zeichen 7 und 8 zum Buchstaben umgewandelt, 10 und 11 unverändert übernommen und aus der Ziffer auf Position 13 der Text "Null" oder "Eins" gemacht ...
wenn ich mir die Ausgabe vorher anschauen möchte, reicht es dann "copy" durch "echo" zu ersetzen
Ja, Du kannst aber auch einfach das "echo" unmittelbar vor "copy" schreiben ...

Wenn Du beim Start des Batches (im Beispiel in der Datei "D:\Kopieren.cmd" gespeichert) noch eine Umleitung der Ausgabe anfügst - etwa:
D:\Kopieren.cmd > D:\Ausgabe.txt
kannst Du danach die gesamte Ausgabe per Editor (oder zB Import in Excel) in Augenschein nehmen ...

Grüße
bastla

[Edit] @Biber
Als ob ich Dich schon jemals überholt hätte ... face-wink

Danke für's genaue Hinschauen face-smile - ich hatte mich leider nur auf die Zerlegung und daher das VBScript konzentriert ...
[/Edit]
Member: any-key
any-key Jun 22, 2010 at 12:05:23 (UTC)
Goto Top
Hey Biber und bastla,

ihr seid großartig. Das klappt wunderbar und mit dem Gerüst kann ich dann die Feinheiten für mein spezielles Problem ausarbeiten.

Ganz lieben dank und alles Gute!

any-key
Member: bastla
bastla Jun 22, 2010 at 12:16:04 (UTC)
Goto Top
Hallo any-key!

Schön, dass es für Dich passt. face-smile

Grüße
bastla