tommyc
Goto Top

Umbennen mittels Text Dateien

Umbennen von mehreren dateien in einem Ordner unter zuhilfenahme von Tekstdateien.

Hallo

Erstmal Gruß an alle.
Lob für die Großartigen Antworten aus den ich immer wieder
schöpfen konnte, leider trete ich auf der Stelle und brauche Hilfe.
System: Win2000 SP4

Habe ein Umbennen Problem.

In einem Musikordner sind zehn musikstücke: Titel1.mp3, Titel2.mp3 usw.
in einer Datei stehen die 10 Titel die ich verwenden möchte,
um die mp3s umzubenennen.
Ich habe for diese Ren.Bat immer in das verzeichnis zu verschieben, daß
umbenenannt wird, so muß ich nur nach dem standort der (Künstler - Atrist.txt) suchen.

Die Textdatei sieht so aus:
01_Its OK
02_Love Wont Wait
03_Tide Is High
usw:

Variablen:

SET SUCHE01=Verzeichnis von
SET SUCHE02="%INTER% - %ALBUM%"
SET USRTMP1=C:\Temp1.txt
SET USRTMP2=C:\Temp2.txt

Das hier weigert sich zu arbeiten, also habe ich das Problem mit einem Zweizeiler gelöst.
Was ist bei dieser Anweisung falsch?
For /F "Tokens=3 Delims= " %%a in (DIR %%0 | FIND /I "%SUCHE01%") do SET DATPFAD=%%a

So ermitle ich den Aktuellen Standort:
REM Aktuellen Verzechinss Suchen
DIR %%0 | FIND /I "%SUCHE01%" > %USRTMP1%
For /F "Tokens=3 Delims= " %%a in (%USRTMP1%) do SET DATPFAD=%%a


ECHO. Auf dem Datentraeger wird nach %SUCHE2% gesucht:
For %%d In (E ) Do DIR %%d:\%SUCHE02%.txt /s | FIND /I /n "%SUCHE01%" > %USRTMP2%
For /F "Tokens=4 Delims= " %%a in (%USRTMP2%) do SET SUCHPFAD=%%a

Ich würde gerne die Angaben Künstler und Album aus dem Verzeichnissbaum extrachieren.
Pfad: z.B. E:\E\A\"Ace Of Base"\Flowers
Wenn das mein Pfad ist wie schaffe ich es die letzten 2 Einträge zu isolieren?
Wenn die Verzeichnisstiefe konstant ist, sollte es machbar sein.
Problematisch is es wenn die Tiefe der Struktur variiert.

Frage 1:
Kann ich das Ergebniss von DIR | FIND weiter bearbeiten ohne
das Lästige Schreiben in eine Text Datei?

Frage 2:
Was hat mit dem "^" auf sich?
diesen habe ich auch mal gesehen ~y oder etwas ähnliches.
die beiden waren in einer For Schleife eingebaut.

Die Grüßte Herausforferung bei meinen Batches ist es alles soweit zu satndarisieren,
das alles auf allen Rechnern läuf. Es sind Immerhin Drei.
Deswegen variiren die Verzechnis Strukturen.

Für Hilfestellung und Anregungen bin ich sehr dankbar.

Content-Key: 29461

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

Printed on: April 23, 2024 at 15:04 o'clock

Member: Biber
Biber Apr 01, 2006 at 01:09:58 (UTC)
Goto Top
Moin TommyC,

ein paar Sachen kann ich schon sagen, ein paar andere sind mir noch unklar im Moment:
Variablen:

SET SUCHE01=Verzeichnis von
Dieses Suchkriterium versteh ich nicht... wo könntest Du die Zeichenkette "Verzeichnis von" finden???? Nicht verstanden...
SET SUCHE02="%INTER% - %ALBUM%"
SET USRTMP1=C:\Temp1.txt
SET USRTMP2=C:\Temp2.txt

Was ist bei dieser Anweisung falsch?
For /F "Tokens=3 Delims= " %%a in (DIR %%0 | FIND /I "%SUCHE01%") do SET DATPFAD=%%a
- Die Anweisung IN der Klammer muss in einfache Hochkommata und, wenn wenn da ein Steuerzeichen dabei ist, ein Caret davor ("^")
- und einen Parameter %%0 gibt es nicht.
%0 wäre der Name der Batchdatei, %1 der erste Parameter, falls Du die Batchdatei mit einem Verzeichnisnamen aufrufst.
- und ein Find geht in die Grütze, wenn im Suchstring Leerzeichen sund (bei %SUCHE01%

For /F "Tokens=3 Delims= " %%a in ('DIR %1 ^| FIND /I "%SUCHE01%"') do SET DATPFAD=%%a

So ermitle ich den Aktuellen Standort:
REM Aktuellen Verzechinss Suchen
DIR %%0 | FIND /I "%SUCHE01%" > %USRTMP1%
DIR %1 | FIND /I "%SUCHE01%" > %USRTMP1%

For /F "Tokens=3 Delims= " %%a in (%USRTMP1%) do SET DATPFAD=%%a
For /F "Tokens=3 Delims= " %%a in (%USRTMP1%) do SET DATPFAD=%%a


ECHO. Auf dem Datentraeger wird nach %SUCHE2% gesucht:
Nein, nach %Suche02%

For %%d In (E ) Do DIR %%d:\%SUCHE02%.txt /s | FIND /I /n "%SUCHE01%" > %USRTMP2%
Nun mal nicht unnötig um die Ecke denken:
DIR "E:\%SUCHE02%.txt" /s | FIND /I /n "%SUCHE01%" > %USRTMP2%
(
For /F "Tokens=4 Delims= " %%a in (%USRTMP2%) do SET SUCHPFAD=%%a

So, mehr versteh ich momentan noch nicht, vor allem das "Verzeichnis von" ist mir nicht klar.
Zu den FOR-Parametern mit der Tilde ("~") steht einiges in der Hilfe zu For ("For /?" am CMD-Prompt)
Poste doch noch noch mal bitte den kompletten Batch incl. der Parameter, die Du dem mitgibst.

Aber nach dem Frühstück reicht.

Gruß
Biber
Member: PCB
PCB Apr 01, 2006 at 13:54:30 (UTC)
Goto Top
Hallo zusammen!

So ermitle ich den Aktuellen Standort:
REM Aktuellen Verzechinss Suchen
DIR %%0 | FIND /I "%SUCHE01%" >
%USRTMP1%
For /F "Tokens=3 Delims= " %%a in
(%USRTMP1%) do SET DATPFAD=%%a


das mit dem akt. Verzeichnis geht mit %~dp0 einfacher


Ich würde gerne die Angaben
Künstler und Album aus dem
Verzeichnissbaum extrachieren.
Pfad: z.B. E:\E\A\"Ace Of
Base"\Flowers
Wenn das mein Pfad ist wie schaffe ich es
die letzten 2 Einträge zu isolieren?
Problematisch is es wenn die Tiefe der
Struktur variiert.

Das mit der wechselnden Verzeichnis-Tiefe ist schon schwieriger, hier mal mein Vorschlag.
Läuft zwar soweit, hat aber keine Funktion um die "Tiefe" zu messen, also fängt er "oben" an (5. Backslash) und arbeitet sich nach unten vor. face-smile
Wenns noch tiefere Pfade gibt, muss man entsprechend höhere FOR-Schleifen einsetzen.


SET Album=
SET Inter=

FOR /F "delims=\ tokens=5" %%i in ("%~dp0") do set Album=%%i
FOR /F "delims=\ tokens=4" %%i in ("%~dp0") do set Inter=%%i
IF NOT "%Album%"=="" goto End

FOR /F "delims=\ tokens=4" %%i in ("%~dp0") do set Album=%%i
FOR /F "delims=\ tokens=3" %%i in ("%~dp0") do set Inter=%%i
IF NOT "%Album%"=="" goto End

FOR /F "delims=\ tokens=3" %%i in ("%~dp0") do set Album=%%i
FOR /F "delims=\ tokens=2" %%i in ("%~dp0") do set Inter=%%i

:End
SET CD=%INTER%-%ALBUM%
FOR /F "delims= eol=#" %%a in (artist.txt) do ren "%%a.mp3" "%CD%-%%a.mp3"

pause >nul

Bin nicht so der FOR-Profi, den Block kann man bestimmt auch noch in 2 -3 Zeilen pessen, aber erstmal läuft es!
Bei den unterschiedlicher Tiefe ist es schwer, eine feste FOR-Bedingung zu setzen, also wird die Variable %Album% nach jeder Schleife geprüft, ob da überhaupt was drinsteht, wenn ja, wird gleich die nächste für den Interpreten genommen und dann zum Unbenennen gesprungen.

my2cents

PCB
Member: Biber
Biber Apr 02, 2006 at 02:47:47 (UTC)
Goto Top
@PCB
das mit dem akt. Verzeichnis geht mit %~dp0 einfacher
Ja, das stimmt zwar, aber dann müsste man/frau es tatsächlich so machen, dass diese RenameMP3.bat wirklich jedesmal in das Verzeichnis kopiert wird, wo die MP3s sind. Denn %~dp0 bezieht sich ja immer auf den Speicherort der Batch-Datei.

Aber das, was Du mit %~dp0 machst, geht natürlich auch eins zu eins mit der Variablen %cd% / aktuelles Verzeichnis.
Das würde ermöglichen, dass die RenameMp3.bat irgendwo im %path% liegt, meinetwegen im %windir%-Verzeichnis und das ein beliebiger Ordner über das Kontextmenü und einen Menüpunkt "RenameMP3s" verarbeitet werden könnte.

Der Batch selbst (der ja den Parameter "UnterverzeichnisXY") bekommt, braucht dann nur noch zu prüfen, ob in diesem Verzeichnis eine "artist.txt" existiert und, wenn ja, in diesem Verzeichnis (also %cd%) vor sich hin batchen.
Oder noch einfacher, einfach einen MP3RenameWithList.bat mit einem Parameter \Pfad\zur\NeueMP3Name.txt aufzurufen.
Das können auch nicht mehr als 20 Zeilen sein.

Mal abwarten, was TommyC von dieser Mimik hält. Ich halte es für Dönekens, diese RenameMP3.bat jedesmal zu kopieren.

P.S. Deine Zeile
FOR /F "delims= eol=#" %%a in (artist.txt) do ren "%%a.mp3" "%CD%-%%a.mp3"
passt nicht zu dem Szenario ...Title1.mp3, Title2.mp3,...TitleN.mp3 liegen vor.

Grüße
Biber
Member: TommyC
TommyC Apr 02, 2006 at 21:32:05 (UTC)
Goto Top
Hallo Biber, danke für die flotte Antwort.
Ich stimme dir voll zu die batch über Explorer zu starten, anstatt die durch die Gegend zu schieben.
Habe bereits einige Projekte erfolgreich abgeschlossen, habe aber noch nicht viel mit verzeichnisbaum
gearbeitet, bei diesem Script ist mein Latein am ende.
So Sieht es aus dank Deiner Hilfe nach der ersten Modifikation:
Die Varis sind weggefallen da es nicht mehr nötig ist den Schrott in die Temp.txt zu schreiben.
SET USRTMP1=C:\Temp1.txt
SET USRTMP2=C:\Temp2.txt
Die wiederrum ist hinzugekommen.
SET LW=E

Das ist Das Komplette Script. nach der ersten Schönheitskur.
REM ==================================
@echo OFF
ECHO.
ECHO.
Die Eingabe wird deim Testleuf übersprungen.
GOTO N1
SET /P WERDA= Wer Du?:
ECHO.
ECHO Was Suchen Du?
SET /P INTER= Intepraet?:
SET /P ALBUM= Album:
SET TITEL=Songtext.txt
:N1
REM Hier werden die Zwei Eigaben vorerst gestzt.
SET INTER=Icehouse
SET ALBUM=Masterfile
SET RENPFAD=%1
ECHO.
ECHO. Gesucht wird nach: "%INTER% - %ALBUM%".txt
ECHO.

SET LW=E
SET SUCHE01=Verzeichnis von
SET SUCHE02="%INTER% - %ALBUM%"

REM Aktuellen Verzechinss Suchen
FOR /F %%i in ("%~dp0") do set DATPFAD=%%i
ECHO. DatPfad - %DATPFAD%
ECHO.

ECHO. Auf dem Datentraeger wird nach %SUCHE02%.txt gesucht:
For /F "Tokens=3 Delims= " %%a in ('DIR %LW%:\%SUCHE02%.txt /s ^| FIND /I "%SUCHE01%"') do SET TEXTPFAD=%%a
ECHO. Textpfad - %TEXTPFAD%
:EOF
REM ==================================
Jetzt erkläre ich dir was das mit der Vari %SUCHE01% auf sich hat.
Kenne keinen anderen Weg eine Datei zu suchen und den Pfad der Gesuchten in einer Vari festzuhalten, deswegen diese umständliche Lösung.

For /F "Tokens=3 Delims= " %%a in ('DIR %LW%:\%SUCHE02%.txt /s ^| FIND /I "%SUCHE01%"') do SET TEXTPFAD=%%a

Die Zeile ist bereit modifiziert, funkt aber genauso wie vorher.
1. Zuerst mache ich ein DIR auf die Gesuchte Datei mit dem /s Parameter
Als Ergebniss kommt das hier raus:
C:\WINNT\system32>dir E:\"Icehouse - Masterfile".txt /s
Datenträger in Laufwerk E: ist WORKSTATION
Datenträgernummer: 649E-47B6

Verzeichnis von E:\Entwicklung\

31.03.2006 14:06 235 Icehouse - Masterfile.txt
1 Datei(en) 235 Bytes

Anzahl der angezeigten Dateien:
1 Datei(en) 235 Bytes
0 Verzeichnis(se), 1.442.820.096 Bytes frei
2. Der Find na dem Pipe Sucht jetzt nach dem "Verzeichnis von"
wie zu sehen ist, kommt der Begriff Verzeichnis zwei mal for.
Der unterschied zwischen den beiden ist das Wort "von" deswegen die suche nach beiden Worten.
Als letztes wird die 3 Spalte der Vari TEXTPFAD übergeben.

kurioserweise funkt der Find auch wenn leerzeichen drin sind, wenn du einen besseren Weg kennst nach Dateien zu suchen, nur raus damit bin für jede Hilfe dankbar.
Hast geschrieben das es nicht nötig ist um die Ecke zu denken, in diesem Fall ist das sicherlich

korrekt.diesmal wollte einfach zu flxibel sein.
Mit meinem konstrukt wollte ich mir einfach eine möglichkeit offen halten mehrere laufwerke zu durchsuchen, was von meiner Kranken Idee kommt, ein Progi zu Schreiben um die Laufzeiten der Computer zu erfassen.

Wie zu sehen ist, habe eine %LW% Vari Für das Laufwerk eingebaut.
Diesen Weg habe ich bisher verwendet um die Größen zu ermiteln, dein Tip wird meinen "DOS-Netzlaufwerk Verbindungs Manager" erheblich Kleiner machen.
Deiner Beschreibung im Letzen Abschnitt stimme ich vollkommen zu. Wäre eine Perfekte Lösung.

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Directory\shell\mp3rename\command]
@="CMD.EXE /V /C mp3rename.BAT \"%L
Dies wäre der passende Registry Schlüssel,
nur bei der Parametrierung der CMD.exe bin ich mir nicht ganz sicher

SET RENPFAD=%1
Dies Wäre die Vari die den angesprochenen an die Batch übergibt.

Beispiel:
E:\Ordner1\Ordner2\Artist\Album
Gibt es möglichkeit den Pfad vom Ende bis Anfang des Pfades zu untesuchen?
Wenn ja, dann brauchen wir nur die ersten zwei zu suchen, also Album %%a und Artist %%b
Wenn die beiden bekannt sind, kann mann mit de suche nach der Textdatei beginen (%%b - %%a.txt)
oder Man könnte pauschal 10 Varis mit For bilden und prüfen Leer oder nicht.

SET CD=%INTER%-%ALBUM%
FOR /F "delims= eol=#" %%a in (%TEXTPFAD%) do ren "%%a.mp3" "%CD%-%%a.mp3"

Deteien im Ordner: Liste der Songnamen in Textdatei:
Titel01.mp3 01_masterfile
Titel02.mp3 02_Sister
Titel03.mp3 03_Southern

ren Titel01.mp3 01_Masterfile.mp3
rem Titel02.mp3 02_Sister.mp3
ren Titel03.mp3 03_Southern.mp3

FOR /F "delims= eol=#" %%a in (Textdatei) do ren "%%a.mp3" "%CD%-%%a.mp3"
Warum sind beim rename beide Varis gleich?
Bedeutet es erste mp3 und erster Titel aus der liste?
Bin ein bischen irritiert.

Hoffe, daß ich alle fragen beantwortet habe, und mein Schrieb einigermaßen übersichtlich ist.
Besten Dank für Deine bisherige Hilfe.
Member: Biber
Biber Apr 02, 2006 at 21:58:40 (UTC)
Goto Top
Hm, TommyC,

nun hast Du mich auch verunsichert, was die sinnvolle Strategie ist, diesen Batch zu organisieren bzw. zu überlegen, wie der Aufruf sinnvoll sein kann.
Wenn ich das richtig verstehe, wird der Batch immer aufgerufen, nachdem durch manuelle Vorarbeit folgendes sichergestellt ist:

a) es existiert irgendwo auf einer Platte eine Unterverzeichnisstruktur "...\Interpret\Album" (z.B. .."\Pink Floyd\Wish You Were Here")
b) in diesem Verzeichnis liegen 1...n *.Mp3-Dateien, die Title1.mp3.....TitleN.mp3 heißen
c) ebenfalls in diesem Verzeichnis befindet sich dir Textdatei mit den endgültigen Titeln für Titel1---TitelN.mp3.

- Nebenbedingung: die RenameMP3WithList.bat befindet sich im %path% oder wird explizit mit Pfadangab gerufen. Jedesmal in das Verzeichnis zu kopieren ist ...ähh.. das machen wir nicht. face-wink
Somit wären als Aufrufszenarien denkbar:

-vom CMD-Prompt aus Aufrufen mit "RenameMP3WithList.bat [Parameter pfad\zu_einer\TitelTextDatei.xyz]"
---> denn im selben Verzeichnis läßt sich a) und b) ermitteln.. keine weitere Eingabe erforderlich
-oder-
- über Explorer/Kontextmenü Folderbezogen, also den Batch auf einen Folder anwenden
> dann muss aber die Titel-Textdatei einen festen Namen haben, der in diesem Verzeichnis gesucht werden kann
-oder-
- über Explorer/Kontextmenü Dateibezogen, also den Batch auf die Titel-Textdatei anwenden.

So...jetzt hab ich es sortiert.*grübel*..dann wäre die Lösung doch..hmm...
> "RenameMP3WithList.bat [Parameter pfad\zu_einer\TitelTextDatei.xyz]"
...denn wenn es den gibt, dann können die beiden Explorer-Kontextmenüvarianten den aufrufen

Moment, ich mach mir mal ein Becks auf und schrubbele den Batch zusammen...

Gruß
Biber
Member: Biber
Biber Apr 02, 2006 at 22:38:47 (UTC)
Goto Top
So,
(ein Becks später...)

Hier wäre mal der erste Entwurf:
::----------snipp MP3RenameWithList.bat
@echo off & setlocal
::Parameter1 = Name der Datei mit den Titeln (neue MP3-Namen)
If "%~1"=="" echo (Syntax: %0 MP3Titel-Liste.ext) & goto :eof  
If not exist "%~1" (echo Keine Datei "%1" gefunden!) & goto :eof  
PUSHD "%~dp1"  
for /f "delims=\ tokens=2-10" %%a in ("%cd%") do (  
  for %%x in ("%%i" "%%h" "%%g" "%%f" "%%e" "%%d" "%%c" "%%b" "%%a") do (  
  if defined album (if not defined inter set "inter=%%~x" ) else if not defined album set "album=%%~x" ))  
SET "MyCD=%INTER%-%ALBUM%" & Set /a "cnt=1"  
FOR /F "delims= eol=#" %%a in (%~nx1) do call :RenNext_TitleN.mpg "%myCD%-%%a.mp3"  
Popd
pause >nul
goto :eof
:RenNext_TitleN.mpg
ren Title%cnt%.mp3 %1
set /a "cnt+=1"  
goto :eof
::----------snapp MP3RenameWithList.bat

Hab ich doch gesagt, dass das keine 20 Zeilen sind...
Ein Test bei mir bringt ( mit "ECHO ren Title%cnt%.mp3 %1" statt "ren Title%cnt%.mp3 %1" natürlich)
$cmd$Mp3RenameWithList.bat "L:\Renametest\3 Doors Down\The better Life\Mp3Titles.txt"  
ren Title1.mp3 "3 Doors Down-The better Life-01_Its OK.mp3"  
ren Title2.mp3 "3 Doors Down-The better Life-02_Love Wont Wait.mp3"  
ren Title3.mp3 "3 Doors Down-The better Life-03_Tide Is High.mp3"  
Ich bin jetzt von einer Text-Datei-mit-Titeln ausgegangen wie in Deinem ersten Posting..nur die "neuen" Namen sind drin. Die bisherigen Dateien werden erwartet als Titel1.mpg....bis Titelnn.mpg.
Das Umbenennen macht die drittletzte Zeile unten:

( bei einer Datei Mp3Titles.txt dieser Formface-smile
01_Its OK
02_Love Wont Wait
03_Tide Is High
(Ende Textdatei)
ren Title%cnt%.mp3 %1  ------------> ren Title1.Mp3 01_Its OK
Ebenso könntest Du in dieser Text-Datei-mit-Titeln aber auch "neuen" und "alten" *.mp3-Namen hinterlegen.
Ist allerdings Mehraufwand und tippfehlerträchtig
...(alternative Form der Songtitel-Textdatei)
Titel01.mp3;01_masterfile
Titel02.mp3;02_Sister
Titel03.mp3;03_Southern
...
Die würde ich aber mit Semikolon trennen (kommt weder im bisherigen Dateinamen noch im Songtitel vor.
Dann müsste das Auslesen der Textdatei-mit-Songtiteln so angepasst werden:
FOR /F "tokens=1-2 delims=; eol=#" %%a in (%~nx1) do ren %%a "%myCD%-%%b.mp3"   
:: der Call-Block und der Counter %cnt% wären überflüssig
Und der Batch hätte nur noch ein gutes Dutzend Zeilen...
Oben habe ich auch diese gewünschte Mimik eingebaut;
Gibt es möglichkeit den Pfad vom Ende bis Anfang des Pfades zu untesuchen?
Das ist dieser etwas unappetitlich aussehende Drei-Zeilen-Einzeiler nach dem PushD.
Geht bestimmt auch kürzer, aber das soll ja nur eine Skizze sein.

Außerdem ist es ja nur ein Gebrauchsbatch und kein qualititätsgeprüftes Stück Software.

Hope That Helps.
Biber
Member: TommyC
TommyC Apr 03, 2006 at 16:33:35 (UTC)
Goto Top
Hi Biber
Der Kontext Eintrag in der Registry geht.
Mußte das Progi ein wenig verändern.
einfaches "&" geht bei mir nicht, "&&" geht, die leerzeichen davor und dahinter lassen die routine amok laufen, habe ebenfalls weg gemacht.
Der %cnt% hat auch eine Veränderung erfahren.
Am sonsten würde es wunderbar klappen.

Beim Aufruf über Kontextmenü des Explorers Übergebe ich %1 an die Batch, also Titel der Textdatei.
CMD.EXE /V /C Renamemp3WithList.Bat \ %1
Da könnte der Hase im Pfeffer liegen.
Wie rufst Du die Batch auf, Wenn ich es genauso aufrufe wie du, könnte das Progi Laufen.

Die Übergabe des Albums und Interpräten klappt Perfect

FOR /F "eol=# delims= " %%a in ("%~nx1") do call :RenNext "%%a.mp3"
"%~nx1" die Anfürungszeichen für eventuelle leerzeichen im Namen.
Bei dieser Zeile kommen selzamme werte raus
%%a hat den wert "Icehouse - Masterfile.txt.mp3"

ren Track%cnt%.mp3 %1
%1 hangt am ende den Namen der Textdatei, nicht den Wert einer Zeile aus dem Text
ren Track1.mp3 Icehouse - Masterfile.txt.mp3

Egal was ich manipuliert habe, Umbenennen hat funktioniert, nur mit dem Falschen wert.
Zweite Schleife kam nicht zu stande, weil die Datei Icehouse - Masterfile.txt.mp3 schon existiert.
So war auch die Fehlermeldung.

Hier Das Progi mit allen Veränderungen:
::----------snipp MP3RenameWithList.bat
@echo off
::Parameter1 = Name der Datei mit den Titeln (neue MP3-Namen)
If "%~1"=="" echo (Syntax: %0 MP3Titel-Liste.ext)&&goto :eof
If not exist "%~1" (echo Keine Datei "%1" gefunden!)&&goto :eof
PUSHD "%~dp1"
for /f "delims=\ tokens=2-10" %%a in ("%cd%") do (
for %%x in ("%%i" "%%h" "%%g" "%%f" "%%e" "%%d" "%%c" "%%b" "%%a") do (
if defined album (if not defined inter set "inter=%%~x" ) else if not defined album set "album=%%~x" ))
Set /a "cnt=1"

FOR /F "delims= eol=#" %%a in ("%~nx1") do call :RenNext_TitleN.mpg "%%a.mp3"
Popd
pause >nul
goto :eof
:RenNext_TitleN.mpg
ren Track%cnt%.mp3 %1
set /a cnt=%cnt%+1
goto :eof
::----------snapp MP3RenameWithList.bat

Bin sicher das Du das Problem findest, Dein Latein ist besser als Meines.

gruß Tom
Member: Biber
Biber Apr 03, 2006 at 17:48:19 (UTC)
Goto Top
Moin tom,

ja, ja ...mein großes Latinum.. *g

Also, da war tatsächlich noch ein Flüchtigkeitsfehler drin, den ich gestern doch gepostet habe.
In der FOR-Schleife unten darf der Wert in der Klammer KEINE umschließenden Anführungszeichen haben.
FALSCH war: ...in ("%~nx1")...do..
RICHTIGER ist: ...in (%~nx1)...do..

Thats all. Ich korrigier das oben.
[Edit] ... öh, da war nichts zu korrigieren... ich hatte es gestern schon OHNE Anfü-Zeichen gepostet und so läuft es auch heute bei mir.
Der Parameter "vollständiger Pfad zur Songtitel-Datei" wird so gut wie IMMER in Anführungszeichen kommen müssen, außer wenn sowohl "Album" noch "Interpret" aus je einem Wort bestehen. Also bei "K:\Kiss\Kiss\Titles.txt" vielleicht. Aber im Normalfall "f:\The Beatles\Yellow Submarine\Titles.txt" würde sowohl uber CMD.exe wie über Explorer-Kontextmenü in Anfü-Zeichen kommen.
[/Edit]

Zu dem Kontextmenü:
Ich habe es eben quick & dirty in einen neuen Schlüssel
[HKEY_CLASSES_ROOT\*\Shell\] reingetrümmert.

Sprich:
-unter "...\Shell" einen Schlüssel "Mp3Rename" angelegt,
-unter MP3Rename einen Schlüssel "command" angelegt.
- in den leeren Standardwert eingetippt Cmd /c mp3renameWithlist.bat "%1"

Als exportierte *.reg-Datei sieht das so aus:
;-------------snipp Mp3Rename.reg
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\Shell]

[HKEY_CLASSES_ROOT\*\Shell\Mp3Rename]
@=""  

[HKEY_CLASSES_ROOT\*\Shell\Mp3Rename\command]
@="cmd /c mp3renameWithlist.bat \"%1\""  

;--------mp3Rename.reg

Geht bestimmt auch anderswo und eleganter, aber zumindest für einen ersten Wurf ist das okay.

Was eventuell noch verfeinert werden kann, ist die Rename-Mimik in den letzen Zeilen.
Da müsstest Du noch mal drüber meditieren, wie die "Song-Titelnamen"-Textdatei aufgebaut sein soll.
So ist es ein bisschen wackelig:
Wenn es nicht Track1...TrackN.mpg gibt, gibt es Fehler.
Heißt: wenn Du mal aus einem Album Track7 und Track9 auslassen willst, weil die nervig sind...-->geht nicht. Die Titel werden von 1..N.. als Mp3 erwartet.
Und: Du kannst hinterher nicht rekonstruieren, ob sich unter dem neuen Datei-Namen "Tide Is High.mpg" auch der richtige Titel verbirgt...siehst ja hinterher nicht mehr mit einem Blick, ob nun Titel2.mpg oder Titel3.mpg diesen neuen Namen erhalten hat.

Die zweite Variante Deiner Songtitel-Datei ist da schon sauberer.
Na ja, wenn Du es optimiert und abgefeilt hast, könntest Du ja mal die Version 2.01 hier posten *gg

Bis dahin
Biber
P.S. Wenn es so erstmal läuft, kannst Du den Beitrag auf gelöst setzen bitte.
Member: PCB
PCB Apr 04, 2006 at 10:32:49 (UTC)
Goto Top
@Biber:

Hallo, das mit dem %~dp0 hab Ich genommen, weil Tommy das so beschrieben hatte:
Ich habe for diese Ren.Bat immer in das
verzeichnis zu verschieben, daß
umbenenannt wird, so muß ich nur nach
dem standort der (Künstler -
Atrist.txt) suchen.

Also bei mir funkt. FOR /F "delims= eol=#" %%a in (artist.txt) do ren "%%a.mp3" "%CD%-%%a.mp3" perfekt, meine Beispiel-MP3's wurden immer richtig umbenannt.

Was stimmt denn da nicht ?

Hab ja schon gesagt, bin nicht so der FOR-Experte, ich bin meistens froh wenn Ichs überhaupt hinkriege! face-wink

PS: Find Ich ja klasse, das hier Batch & DOS noch so ausführlich behandelt wird, in den meisten Foren wird da auf Sparflamme gekocht!

my2cents

PCB
Member: Biber
Biber Apr 04, 2006 at 10:47:24 (UTC)
Goto Top
@PCB

hast ja recht: wenn die *.bat-Datei wirklich jedesmal im verzeichnis mit den MP3s vorliegt, dann geht es auch mit %~dp0.

Nur das wollte ich vermeiden.

Die Renamerei klappt bei Dir, wenn
Vorher: "The Machine.mp3" vorliegt,
>"Pink Floyd - "Wish You Were Here - The Machine.mp3"

Aber das Szenario wäre ja gewesen, dass vorliegt:
Title1.mp3
Title2.mp3
...

Und überhaupt: Du hast Tommy wenigstens am Anfang gleich verstanden - da war ich viel langsamer.

Sollte keine Kritik sein, ohne Deinen Ansatz hätte ich gar nicht so schnell den Zugang gefunden. face-wink

Grüße
Biber
Member: TommyC
TommyC Apr 04, 2006 at 14:34:44 (UTC)
Goto Top
Gruß Biber.
Das ist das Fertige Tool, das dank Deinem unermüdlichen Einsatz entstanden ist.

Das mit der artist.txt im Musikverzeichnis ist bereits Geschichte.
Habe eine Suche eingebaut, Musikbaum und Texste sind getrennt.
Alles läuft perfect. Nach Zig erfolgreichen Tests bin ich sehr zufrieden.


Testbedingungen auf Meiner Machine:
Textdateien auf E:\Entwicklung\ID3\TXT\

Musik auf: I:\Multimedia\Sound\mp3\E\I\ICEHOUSE\MASTERFILE\

Musik auf: F:\RenameTeast\ICEHOUSE\MASTERFILE\

Fehlerlos gelaufen unter allen Testbedingungen.

1. Gesucht wird nach Interprät.
2. Die Namen des Interpräts und Albumname werden aus dem Text gelesen und beim Umbenennen an den Pfad gehängt, so funktioniert das
ganze auch mit Leerzeichen in der Ordnerstrucktur.

3. Textdatei darf keine Leerzechen enthalten, sonst entsteht Chaos, zumindest bei mir. Unterstrich hilft die übersicht zu behalten.
4. Extention eingebaut.

:: ----------snipp MP3RenameWithList.bat
@echo off
:: Param Tabelle
set SUCHE01=Verzeichnis von
:: Laufwerke auf den gesucht werden soll.
set LW1=I
set LW2=
set LW3=
set EXT=mp3

:: Parameter1 = Name der Datei mit den Titeln (neue MP3-Namen)
If "%~1"=="" echo (Syntax: %0 MP3Titel-Liste.ext)&&goto :eof
If not exist "%~1" (echo Keine Datei "%1" gefunden!)&&goto :eof
PUSHD "%~dp1"
for /f "delims=\ tokens=2-10" %%a in ("%cd%") do (
for %%x in ("%%i" "%%h" "%%g" "%%f" "%%e" "%%d" "%%c" "%%b" "%%a") do (
if defined album (if not defined inter set "inter=%%~x" ) else if not defined album set "album=%%~x" ))
Set /a "cnt=1"

:: Interpraerten aus dem Pfad islolieren fur die Suche im Musikverzeichnis.
FOR /F "tokens=2* delims==" %%a in ('find /i "inter" %~nx1') do set SUCHINTER=%%a
FOR /F "tokens=2* delims==" %%a in ('find /i "album" %~nx1') do set SUCHALBUM=%%a

ECHO.
ECHO. Suche nach %SUCHALBUM% auf laufwerken [%LW1%:], [%LW2%:], und [%LW3%:]
For %%s in (%LW1% %LW2% %LW%) do For /F "Tokens=* " %%a in ('DIR %%s:\"%SUCHINTER%" /s ^| FIND /I "%SUCHE01%"') do set LW=%%a

:: DIese Schleife ist wegen der Leerzeichen im Pfad notwendig.
:: Kuerzen des Gefundenen Pfades vorne um 17 Zeichen.
SET ZAHL=1
:KUERZGO
IF "%ZAHL%" == "17" Goto KURZEND
SET /A "ZAHL+=1"&&SET LW=%LW:~1%&&GOTO KUERZGO
:KURZEND
ECHO.
ECHO. %LW%\"%SUCHINTER%"\"%SUCHALBUM%"
ECHO.
:: Eintraege für das umbenennen aus der Textdatei holen.
FOR /F "tokens=1,2* delims=_" %%a in (%~nx1) do set NO=%%a&&set TIT=%%b&&call :RenNext
Popd
pause >nul
goto :eof
:RenNext
:: Ping Localhost -n 2 >NUL
:: ECHO %NO%_%TIT%
if %cnt% GTR 9 goto GREAT
:: ECHO %LW%\"%SUCHINTER%"\"%SUCHALBUM%"\*0%cnt%*.mp3 "%NO%_%TIT%".%EXT%
ren %LW%\"%SUCHINTER%"\"%SUCHALBUM%"\*0%cnt%*.mp3 "%NO%_%TIT%".%EXT%

goto COUNTER
:GREAT
:: ECHO %LW%\"%SUCHINTER%"\"%SUCHALBUM%"\*%cnt%*.mp3 "%NO%_%TIT%".%EXT%
ren %LW%\"%SUCHINTER%"\"%SUCHALBUM%"\*%cnt%*.mp3 "%NO%_%TIT%".%EXT%
:COUNTER
set /a cnt=%cnt%+1
goto :eof
:: ----------snapp MP3RenameWithList.bat

Das Ist die Dazugehörige Textdatei: Haddaway_TheAlbum.txt
Die ersten zwei Zeilen sind fur den Umbennenpfad notwendig falls leerzechen vorhanden.
Inhalt der Textdatei:
inter=Haddaway
album=The Album

01_What Is Love
02_Shout
03_Yeah
04_Rock My Heart
05_When The Feelings Gone
06_What Is Love (Rapino Brothers Mix)
07_Life
08_Mamas House
09_Come Back
10_Sing About Love
11_I miss You
12_Life (Album Remix)
Der Eintrag aus der Registry:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\txtfile\shell\RenameWithList]

[HKEY_CLASSES_ROOT\txtfile\shell\RenameWithList\command]
@="CMD.EXE /C Renamemp3WithList.cmd \"%1\""
@pcm

Track1.mp3 ist nicht gleich Track01.mp3
Die reihenfolge ist ganz anders wenn keine Null vor der zahl steht.
Track1
Track10
Track2
Schau genau nach ob eine Null vor der zahl steht, normalerweise steht da eine Null.
Nero, Musicmatch schreiben die Null am Anfang oder Ende der Zeile. Wo die Zahl steht, spielt keine Rolle.
So sieht das mit einer Null aus:
Track01
Track02
Track10
Track12
Beim umbenennen geht der rename Zeile für Zeile vor und springt nicht in der Gegend rum.
Habe dies gerade getestet, es gibt Chaos wenn eine zahl größer 9 vorhanden ist. (ohne Null)
Zahlen 10 und größer laufen auch, wenn keine 1 in der nähe ist.

Vesuche es mit dem Gebilde, vielleicht ist Dein Problem damit behoben.
Member: Biber
Biber Apr 04, 2006 at 14:55:08 (UTC)
Goto Top
Sehr schön, TommyC,

das finde ich ein schönes Beispiel für eine gemeinsam entwickelte Lösung hier im Forum.

Eine Anmerkung noch zu der oberen FOR..IN..DO..-Anweisung
Da habe ich geschrieben:
for /f "delims=\ tokens=2-10" %%a in ("%cd%")

das heißt, er dröselt den aktuellen Verzeichnispfad erst ab Token/Ebene 2 auf.
Passt bei allen unseren Beispielen; es ist aber anzumerken, dass der Batch nicht laufen würde, wenn direkt unter Root das Interpret-Verzeichnis liegen würde.

Würde ich auch nie machen oder erwarten, sondern auch alles in einem Unterordner "\Music" oder ähnlich sammeln.

Dennoch: allgemein tauglich wäre die Pfad-Aufroll-FOR-Anweisung so:

for /f "delims=\ tokens=1-9" %%a in ("%cd%") ...

Rest bleibt wie es ist.

Wenn "das Thema gegessen ist", kannst Du bitte den Beitrag auf gelöst setzen.
Ich lasse ihn aber noch offen, falls da noch kosmetische Änderungen oder Erweiterungen oder Varianten kommen. Denke schon, dass diesen Batch einige ausprobieren und anpassen.

Grüße
Biber