Ordnernamen mit mp3-Information und Inhalt (Titel) auslesen und in Textdatei schreiben
Hallo,
ich bin grad ein wenig überfordert was meine Kenntnisse bezüglich batch-Programmierung
angehen. Ich komme trotz durchforsten dieses Forums nicht weiter, hier mein Vorhaben:
Ich will eine Textdatei (daten.js) erstellen, in welcher Daten von mp3-Alben enthalten sind,
welche später weiterverwendet werden sollen. Die Datei soll wie folgt aussehen:
[artist,album,jahr,ordner,songs]
Beispiel:
Die Strukur der auszulesenen Ordner schaut z.b. so aus:
ect... sowie:
Im Namen des Album-Verzeichnis stehen somit alle Informationen bezüglich Artist, Album und Jahr.
Die folgenden "Zeilen" filtern alle Ordner mit mp3-Alben heraus,
der Verzeichnis-String wird in Artist,Album, Jahr und Ordner zerlegt sowie alle
Songs ausgelesen, bis danach das nächste Verzeichnis "abgearbeitet" wird.
Das Problem liegt darin, dass der Verzeichnisstring sowie die Songnamen noch Leerzeichen enthalten:
artist a , album , 1, 2005
Sobald ich ein Leerzeichen bei delims mit angebe, ist dies syntaktisch nicht mehr"verarbeitbar",
Das Trennzeichen sollte aber " - " (geht das überhaupt?) lauten.
Ausserdem schaffe ich es nicht die Songs ohne Zeilenumbruch (hinter Artist, Album, Jahr und Ordnernummer) einfach mit "ranzuhängen,
so dass der gesamte String exakt wie um obigen Beispiel (daten.js) aufgebaut ist."
Kann mir hier jemand freundlicher Weise weiterhelfen?
Vielen Dank,
evileye
ich bin grad ein wenig überfordert was meine Kenntnisse bezüglich batch-Programmierung
angehen. Ich komme trotz durchforsten dieses Forums nicht weiter, hier mein Vorhaben:
Ich will eine Textdatei (daten.js) erstellen, in welcher Daten von mp3-Alben enthalten sind,
welche später weiterverwendet werden sollen. Die Datei soll wie folgt aussehen:
[artist,album,jahr,ordner,songs]
Beispiel:
var daten = unescape('\#Artist a,Album a,2005,1,song a|song b|song c|song d\#Artist b,Album b,2005,1,song a|song b|song c|song d|song e\');
Die Strukur der auszulesenen Ordner schaut z.b. so aus:
c:\music\1\Artist a - Album 1 - Jahr\[01] Artist - Songtitel.mp3 c:\music\1\Artist a - Album 1 - Jahr\[02] Artist - Songtitel.mp3 c:\music\2\Artist b - Album 2 - Jahr\[01] Artist - Songtitel.mp3 c:\music\2\Artist b - Album 2 - Jahr\[02] Artist - Songtitel.mp3
ect... sowie:
c:\music\index\include\daten.js
Im Namen des Album-Verzeichnis stehen somit alle Informationen bezüglich Artist, Album und Jahr.
Die folgenden "Zeilen" filtern alle Ordner mit mp3-Alben heraus,
der Verzeichnis-String wird in Artist,Album, Jahr und Ordner zerlegt sowie alle
Songs ausgelesen, bis danach das nächste Verzeichnis "abgearbeitet" wird.
@echo offfor /f "tokens=1-4 delims=\" %%a in ('dir ..\..\ /S /B /O /AD') do (if not "%%d"=="" if not "%%c"=="index" (for /f "tokens=1-4 delims=-" %%i in ('@echo %%d') do ( @echo %%i,%%j,%%c,%%k )for /f "tokens=1-4 delims=-" %%x in ('dir "%%a\%%b\%%c\%%d\*.mp3" /B') do ( @echo %%y )))pause
Das Problem liegt darin, dass der Verzeichnisstring sowie die Songnamen noch Leerzeichen enthalten:
artist a , album , 1, 2005
Sobald ich ein Leerzeichen bei delims mit angebe, ist dies syntaktisch nicht mehr"verarbeitbar",
Das Trennzeichen sollte aber " - " (geht das überhaupt?) lauten.
Ausserdem schaffe ich es nicht die Songs ohne Zeilenumbruch (hinter Artist, Album, Jahr und Ordnernummer) einfach mit "ranzuhängen,
so dass der gesamte String exakt wie um obigen Beispiel (daten.js) aufgebaut ist."
Kann mir hier jemand freundlicher Weise weiterhelfen?
Vielen Dank,
evileye
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 53896
Url: https://administrator.de/contentid/53896
Ausgedruckt am: 19.11.2024 um 19:11 Uhr
21 Kommentare
Neuester Kommentar
Moin evileye07,
in der Theorie sollte es so funktionieren:
[ungetestete Skizze]
Gruss
Biber
[Edit: Das direkte Setzen des Pipe-Symbols "|" wird so nicht gehen.
Entweder Du nimmst ein anderes Zeichen (z.B. "@")
oder Du nimmst zuerst das Zeichen "@" und ersetzt es unmittelbar vor dem ECHOen.
Dann aber musst Du mit DelayedExpansion arbeiten, da alles innerhalb EINER For-Anweisung stattfindet.
[/Edit]
in der Theorie sollte es so funktionieren:
@echo off & setlocal enableDelayedExpansion
for /f "tokens=1-4 delims=\" %%a in ('dir ..\..\ /S /B /O /AD') do (
if not "%%d"=="" if not "%%c"=="index" (
for /f "tokens=1-3 delims=- " %%i in ("%%d") do (
call :AddTitle
call :Trim %%i,%%j,%%c,%%k
for /f "tokens=2 delims=-" %%x in ('dir "%%a\%%b\%%c\%%d\*.mp3" /B') do call :AddTitle %%x
REM [siehe unten!! ] set titles=!titles:@=^|!
@echo %itrim%,%jTrim%,%cTrim%,%kTrim%,!titles:~0,-1!
)))
pause
goto :eof
:Trim
Set iTrim=%1
set jTrim=%2
set cTrim=%3
set kTrim=%4
goto :eof
:AddTitle
If [%1]== Set "Titles=" & goto :eof
Set Titles=%Titles%%*@
REM Diese Zeile enthält .....%Titles% + Param%1 + Zeichen @ ---alles zusammengequetscht
goto :eof
[ungetestete Skizze]
Gruss
Biber
[Edit: Das direkte Setzen des Pipe-Symbols "|" wird so nicht gehen.
Entweder Du nimmst ein anderes Zeichen (z.B. "@")
oder Du nimmst zuerst das Zeichen "@" und ersetzt es unmittelbar vor dem ECHOen.
>set titles=bla@blubb@whatever
>set titles=%titles:@=^|%
>set titles
titles2=bla|blubb|whatever
[/Edit]
Moin evileye07,
ich habe mal versucht, diesen "call: AddTitle %%x"-Aufruf zu isolieren und separat zu testen.
Zumindest dort muss eine kleine Anpassung rein.
Und im obigen Source:
Wir werden uns da schon rantasten...
Gruss
Biber
Ich ändere es oben im Source.
ich habe mal versucht, diesen "call: AddTitle %%x"-Aufruf zu isolieren und separat zu testen.
Zumindest dort muss eine kleine Anpassung rein.
::evilexe2.bat
@echo off & setlocal
for /f "eol=; tokens=2 delims=-" %%x in (f:\temp\titles.txt) do call :AddTitle %%x
echo %titles:~0,-1%
goto :eof
:AddTitle
If [%1]== Set "Titles=" & goto :eof
<b>Set Titles=%Titles%%*@</b>
REM <b>Hier Parameter %* statt Parameter%1 !!</b>
goto :eof
:: ----snapp evileye.bat
------------
Ergebnis:
>type f:\temp\titles.txt
[01] Hans Heimlich - Hurra.mp3
[02] Hans Heimlich - Morgen.mp3
[03] Hans Heimlich - Werd ich 20.mp3
;
;2.Ordner:
;
;c:\music\2\Gundula Grantig - Best of Gundula - 2008
;darin enthalten die Songs:
;
[01] Gundula Grantig - Born 1908.mp3
[02] Gundula Grantig - Yesterday.mp3
[03] Gundula Grantig - I was young.mp3
>f:\temp\evileye2
Hurra.mp3@Morgen.mp3@Werd ich 20.mp3@Born 1908.mp3@Yesterday.mp3@I was young.mp3
Und im obigen Source:
Streiche: @echo %Album%,%Artist%,%Ordner%,%Jahr%,%titles:~0,-1%
Setze: @echo %Album%,%Artist%,%Ordner%,%Jahr%,!titles:~0,-1!
Setze: @echo %Album%,%Artist%,%Ordner%,%Jahr%,!titles:~0,-1!
Wir werden uns da schon rantasten...
Gruss
Biber
Ich ändere es oben im Source.
Hallo Ihr Beiden!
Ich hab auch ein wenig gebastelt und bin bei folgendem Stand:
Grüße
bastla
[Edit] Die ganze Leerzeichen-Eliminiererei gehörte noch aus der "echo"-Zeile ins ":Trim" verlegt ... [/Edit]
[Edit2] ... und der Ordnung halber auch einmal das "#" an den Anfang der Ausgabezeile gesetzt. [/Edit2]
Ich hab auch ein wenig gebastelt und bin bei folgendem Stand:
@echo off & setlocal enableDelayedExpansion
for /f "tokens=1-4 delims=\" %%a in ('dir ..\..\ /S /B /O /AD') do (
if not "%%d"=="" if not "%%c"=="index" (
for /f "tokens=1-3 delims=-" %%i in ("%%d") do ( call :Trim "%%i","%%j","%%c","%%k" )
set "Titles="
for /f "tokens=2 delims=-" %%x in ('dir "%%a\%%b\%%c\%%d\*.mp3" /B') do call :AddTitle "%%x"
@echo #!Album!,!Artist!,!Ordner!,!Jahr!,!Titles:~0,-1!
))
pause
goto :eof
:Trim
Set Album=%~1
Set Album=%Album:~0,-1%
set Artist=%~2
set Artist=%Artist:~1,-1%
set Ordner=%~3
set Jahr=%~4
set Jahr=%Jahr:~1%
goto :eof
:AddTitle
Set Title=%~1
Set Titles=%Titles%%Title:~1%@
goto :eof
Grüße
bastla
[Edit] Die ganze Leerzeichen-Eliminiererei gehörte noch aus der "echo"-Zeile ins ":Trim" verlegt ... [/Edit]
[Edit2] ... und der Ordnung halber auch einmal das "#" an den Anfang der Ausgabezeile gesetzt. [/Edit2]
Moin bastla,
auch nicht schlecht...
Sonst keinerlei Einwände...
Grüsse
Biber
auch nicht schlecht...
@echo !Album:~0,-1!,!Artist:~0,-1!,!Ordner!,!Jahr:~1!,!Titles:~0,-1!
Davor hatte ich zurückgeschreckt, falls mal bei den vorhandenen .mp3's der Trennstrich nicht von einem Leerzeichen gefolgt sein sollte (also diese Konvention "bla - blubb - mehr blubb" irgendwo nicht sauber eingehalten ist).Sonst keinerlei Einwände...
Grüsse
Biber
@Biber
Wozu gibt's dann Konventionen?
Ich hab's noch etwas ordentlicher gemacht (wenn's schon extra ein ":Trim" gibt).
Übrigens: Wenn Alben/Interpreten/Titel mit "!" im Namen dabei sind ...
Grüße
bastla
Wozu gibt's dann Konventionen?
Ich hab's noch etwas ordentlicher gemacht (wenn's schon extra ein ":Trim" gibt).
Übrigens: Wenn Alben/Interpreten/Titel mit "!" im Namen dabei sind ...
Grüße
bastla
@bastla
Andererseits: "Theo...wir fahrn nach Lodz!" *grübel*
Ach menno, das wird wieder viel zu komplex.... <grinz>
Grüße
Biber
Wenn Alben/Interpreten/Titel mit "!" im Namen dabei sind ...
...sieht für mich nicht so aus, als wäre er ein Punk-Fan.... Andererseits: "Theo...wir fahrn nach Lodz!" *grübel*
Ach menno, das wird wieder viel zu komplex.... <grinz>
Grüße
Biber
@Biber
Obwohl, wenn's nur ein "!" wäre, ging's ja noch ...
Grüße
bastla
Obwohl, wenn's nur ein "!" wäre, ging's ja noch ...
Ach menno, das wird wieder viel zu komplex.... <grinz>
Na dann ::Trim
Set "Album=%~1"
if "%Album:~-1%"==" " Set "Album=%Album:~0,-1%"
set "Artist=%~2"
if "%Artist:~0,1%"==" " Set "Artist=%Artist:~1%"
if "%Artist:~-1%"==" " Set "Artist=%Artist:~0,-1%"
set "Ordner=%~3"
set "Jahr=%~4"
if "%Jahr:~0,1%"==" " Set "Jahr=%Jahr:~1%"
goto :eof
Grüße
bastla
Hallo evileye07!
Wie ist es, wenn Du auch bei "Set Title" die Anführungszeichen verwendest, also:
Grüße
bastla
Wie ist es, wenn Du auch bei "Set Title" die Anführungszeichen verwendest, also:
:AddTitle
Set "Title=%~1"
Set "Titles=%Titles%%Title:~1%@"
Wäre es zudem sinnvoll die Variablen/Speicher nach Abarbeitung per for-schleife zu löschen/freizugeben?
Wenn Du gesteigerten Wert darauf legst, kannst Du ja ein endlocal einbauen ...Grüße
bastla
Moin evileye,
das Problem mit dem Ausrufungszeichen ist ein in der Tat ein saudummer Fehler,
der IMHO mehr über M$ aussagt, als ich mich je auch nur öffentlich anzudeuten trauen würde.
Lässt sich aber nicht mit vertretbarem Aufwand umgehen (soweit ich weiss).
Ich kann diese !-Zeichen auch nicht maskieren bzw. es ist mir nicht gelungen.
"Nicht mit vertretbarem Aufwand" heißt:
- ich würde als erstes überlegen, ob ich diese .mp3's mit Ausrufungszeichen vorher umbenennen kann oder ob diese Ausrufungszeichen tatsächlich für mich einen erhaltenswerten Informationsgehalt haben
- falls ich diese Ausrufungszeichen für absolut unverzichtbar hielte, dann...
- würde ich mir zuerst ein Becks aufmachen,
- und dann diese calllöcke auflösen, so dass jeweils ab Ende der FOR-Anweisung nur ein Call:sub steht
- in diesem call:sub kann dann die nächste FOR-Anweisung starten und ihrerseits ein call :sub2 aufrufen
> so kann ich auf die DelayedExpansion verzichten
-oder-
ich umgehe die DelayedExpansion, indem ich stattdessen mit "CALL %%%%var%%%%%" -Aufrufen arbeite...
(aber darüber möchte ich gar nicht erst sprechen, das ist absolut unleserlich, streiche Variante 2)
Bitte prüfe erst mal für Dich, ob diese Ausrufungszeichen verzichtbar wären in den .mp3-Titeln.
Dann sehen wir weiter.
Gruss
Biber
das Problem mit dem Ausrufungszeichen ist ein in der Tat ein saudummer Fehler,
der IMHO mehr über M$ aussagt, als ich mich je auch nur öffentlich anzudeuten trauen würde.
Lässt sich aber nicht mit vertretbarem Aufwand umgehen (soweit ich weiss).
Ich kann diese !-Zeichen auch nicht maskieren bzw. es ist mir nicht gelungen.
"Nicht mit vertretbarem Aufwand" heißt:
- ich würde als erstes überlegen, ob ich diese .mp3's mit Ausrufungszeichen vorher umbenennen kann oder ob diese Ausrufungszeichen tatsächlich für mich einen erhaltenswerten Informationsgehalt haben
- falls ich diese Ausrufungszeichen für absolut unverzichtbar hielte, dann...
- würde ich mir zuerst ein Becks aufmachen,
- und dann diese calllöcke auflösen, so dass jeweils ab Ende der FOR-Anweisung nur ein Call:sub steht
- in diesem call:sub kann dann die nächste FOR-Anweisung starten und ihrerseits ein call :sub2 aufrufen
> so kann ich auf die DelayedExpansion verzichten
-oder-
ich umgehe die DelayedExpansion, indem ich stattdessen mit "CALL %%%%var%%%%%" -Aufrufen arbeite...
(aber darüber möchte ich gar nicht erst sprechen, das ist absolut unleserlich, streiche Variante 2)
Bitte prüfe erst mal für Dich, ob diese Ausrufungszeichen verzichtbar wären in den .mp3-Titeln.
Dann sehen wir weiter.
Gruss
Biber
@Biber
Grüße
bastla
und dann diese calllöcke auflösen, so dass jeweils ab Ende der FOR-Anweisung nur ein Call:sub steht
Daran versuch' ich mich gerade (bevor ich das Ganze in VBS mache) ...Grüße
bastla
@bastla
Und wenn er dann sacht: "Och, eigentlich sind mir diese Ausrufungszeichen eher unwichtig..."???
Oder: "Och, dann warte ich eben kurz, bis M$ eine stabile bugbereinigte CMD-Version herausbringt.." ???
Grüsse
Biber
Und wenn er dann sacht: "Och, eigentlich sind mir diese Ausrufungszeichen eher unwichtig..."???
Oder: "Och, dann warte ich eben kurz, bis M$ eine stabile bugbereinigte CMD-Version herausbringt.." ???
Grüsse
Biber
@Biber
Wenn er das sacht, isser zu spät dran
Sagtest Du weiter oben was von Komplexität? Ich hoffe, wir kommen ohne aus ...
Grüße
bastla
P.S.:
[Edit] Meckervorbeugungsmaßnahme in Batch-Zeile 1 getroffen [/Edit]
Wenn er das sacht, isser zu spät dran
@echo off & setlocal
for /f "tokens=1-4 delims=\" %%a in ('dir ..\..\ /S /B /O /AD') do call :ProcessDir "%%a","%%b","%%c","%%d"
goto :eof
:ProcessDir
if %4=="" goto :eof
if %3=="" goto :eof
if %3=="index" goto :eof
if %3=="1" goto :eof
for /f "tokens=1-3 delims=-" %%i in (%4) do call :Trim "%%i","%%j",%3,"%%k"
set "Titles="
for /f "tokens=2 delims=-" %%x in ('dir "%~1\%~2\%~3\%~4\*.mp3" /B') do call :AddTitle "%%x"
set "Zeile=#%Album%,%Artist%,%Ordner%,%Jahr%,%Titles:~0,-1%"
set "Zeile=%Zeile:&=^&%
echo %Zeile%
goto :eof
:Trim
Set "Album=%~1"
if "%Album:~-1%"==" " Set "Album=%Album:~0,-1%"
set "Artist=%~2"
if "%Artist:~0,1%"==" " Set "Artist=%Artist:~1%"
if "%Artist:~-1%"==" " Set "Artist=%Artist:~0,-1%"
set "Ordner=%~3"
set "Jahr=%~4"
if "%Jahr:~0,1%"==" " Set "Jahr=%Jahr:~1%"
goto :eof
:AddTitle
Set "Title=%~1"
Set "Titles=%Titles%%Title:~1%@"
goto :eof
Sagtest Du weiter oben was von Komplexität? Ich hoffe, wir kommen ohne aus ...
Grüße
bastla
P.S.:
... bis M$ eine stabile bugbereinigte CMD-Version herausbringt.." ???
Ich dachte, die gibt's schon - heißt doch "bash" oder so ... *sinnier*[Edit] Meckervorbeugungsmaßnahme in Batch-Zeile 1 getroffen [/Edit]
@bastla
Ja, ja, in meiner Jugend war ich auch so ungestüm.. *seufz*
Wenn noch ein " & setlocal" hinter dem "@echo off" stünde, dann könnten wir es evileye07 ja vielleicht anbieten...
So gibt es bestimmt wieder nur Mecker ...
..außerdem ist das doch von irgendwelchen OpenSource-Anarchisten oder so, glaub ich...
Das hat bestimmt weniger Zukunft als M$...
Grüsse und danke
Biber
Ja, ja, in meiner Jugend war ich auch so ungestüm.. *seufz*
Wenn noch ein " & setlocal" hinter dem "@echo off" stünde, dann könnten wir es evileye07 ja vielleicht anbieten...
So gibt es bestimmt wieder nur Mecker ...
heißt doch "bash" oder so...
Quatsch, die bash kann ja noch nicht mal selber BlueScreens erzeugen.....außerdem ist das doch von irgendwelchen OpenSource-Anarchisten oder so, glaub ich...
Das hat bestimmt weniger Zukunft als M$...
Grüsse und danke
Biber
@Biber
Nö, Mecker woll'n wir nich ...
Grüße
bastla
Nö, Mecker woll'n wir nich ...
Quatsch, die bash kann ja noch nicht mal selber BlueScreens erzeugen...
Ich nehme an, dircolors gilt in dem Zusammenhang nicht (nicht blau genug), aber wie wär's mit [e[0;37;0;44m]?Grüße
bastla