derderkeineahnunghat
Goto Top

Batch - relativen Pfad filtern

HILFE

Hallo, habe unter Playliste *.pls mit bat erstellen ein tolles Skript zur Erstellung von Playlists gefunden. Leider arbeitet das nur mit absoluten Pfadabgaben, ich brauche die Playlists aber für meinen mp3-Player, der arbeitet nur mit relativen Pfaden. Da ich das aktuelle und alle Unterverzeichnisse durchsuchen muss, kann ich mit ./ nichts anfangen. Ich habe bereits versucht den set-Befehl zu modifizieren, scheitere aber daran, dass der komplette Pfad damit gelöscht wird, auch wenn nur der letzte Teil ersetzt werden soll. Kann mir jemand helfen? Anbei das Script

::---snipp Playlist-maker-mit-Parameter-Startverzeichnis.bat
@echo off & setlocal EnableDelayedExpansion
If [%1]== (Echo %0: kein Startverzeichnis angegeben!) && goto :eof
CHCP 1252>nul
REM Hier will ich nur die Verzeichnisebene direkt unter Startverzeichnis, z.B. "c:\Eigene Musik" abfackeln  
PushD "%~1"  
REM Sowohl Ordner in dieser Verzeichnisebene darunter können Leerzeichen enthalten ["Hip Hop from Moldavia"]  
REM und IMMER  habe das die Verzeichnisnamen im gesamten Pfad ["C:\Eigene Musik\Blasmusik"]  
REM Also beide Parameter IMMER in Anführungszeichen.
REM Zuerst das Startverzeichnis selbst
REM for /d %%i in (*.*) do call :makeThePlaylist "." "."  
REM und nun alle Ebenen darunter rekursiv...



for /f "delims=" %%i in ('dir /b /s /A:d "%~1"') do (  
  call :makeThePlaylist "%%~nxi" "%%i"  
)
PopD
goto :eof

:makeThePlayList
:: ---snipp Playlist-maker.bat:
echo %1 %2
set "pls=%~dp2%~1\%~1.pls"  
set A=%2
set A=%A:%1=%
echo %A% 

REM Parameter1 und Parameter2 können beide in Anführungszeichen kommen- also mit "%~1"/"%~2" Anfü-Zeichen wegfiltern  
set /a counter=0
for /R "%~2" %%i in (*.mp3) do set /a counter+=1  
If %counter%==0 goto :eof
REM @ECHO pls: %pls% ; [%2];[%counter%]
@echo [playlist]>"%pls%"  
(echo NumberOfEntries=%counter%)>>"%pls%"  
set /a counter=1
for /R  "%~2" %%i in (*.mp3) do (  
  echo File!counter!=%%i>>"%pls%"  
  echo Title!counter!=%%~ni>>"%pls%"  
  set /a counter+=1
)
goto :eof



[Edit Biber] Code in Code-Tags gesetzt. [/Edit]

Content-Key: 116646

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

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

Member: bastla
bastla May 24, 2009 at 09:35:29 (UTC)
Goto Top
Hallo Anhnungsloser und willkommen im Forum!

Soferne Du nur eine Gesamt-Playlist für alles unterhalb des übergebenen Startverzeichnisses benötigst, könntest Du folgende Variante testen:
::---snipp Playlist-maker-mit-Parameter-Startverzeichnis.bat
@echo off & setlocal EnableDelayedExpansion
If [%1]== (Echo %0: kein Startverzeichnis angegeben!) && goto :eof
CHCP 1252>nul

set "BasePath=%~f1\"  
PushD "%BasePath%"  
call :makeThePlaylist "%~nx1" "%~1"  
PopD
goto :eof

:makeThePlayList
set "pls=%~dp2%~1\%~1.pls"  

REM Parameter1 und Parameter2 können beide in Anführungszeichen kommen- also mit "%~1"/"%~2" Anfü-Zeichen wegfiltern  
set /a counter=0
for /R "%~2" %%i in (*.mp3) do set /a counter+=1  
If %counter%==0 goto :eof

echo [playlist]>"%pls%"  
(echo NumberOfEntries=%counter%)>>"%pls%"  
set /a counter=1
for /R "%~2" %%i in (*.mp3) do (  
    set "RelPath=%%~fi"  
    set "RelPath=!RelPath:%BasePath%=!"  
    echo File!counter!=!RelPath!>>"%pls%"  
    echo Title!counter!=%%~ni>>"%pls%"  
    set /a counter+=1
)
goto :eof
Grüße
bastla

[Edit] In Zeile 8 aufgrund LotPings Hinweis "%1" durch "%~1" ersetzt und auch gleich das überzählige %-Zeichen vor "%~nx1" entsorgt - das kommt davon, wenn beim Umstricken von "%%i" auf "%1" ungenau gearbeitet wird [/Edit]
Mitglied: 77559
77559 May 24, 2009 at 09:57:37 (UTC)
Goto Top
Hallo "derkeineAhnunghat",

auch vonmir ein "Willkommen im Forum".

Beim Posten von Code solltest du die Formatierungshinweise beachten und die Tags < code> < /code> benutzen, es ist dann einfach besser lesbar.

@bastla Sollte in Zeile 08. am Ende nicht besser "%~1" stehen?

Gruß
LotPings
Member: bastla
bastla May 24, 2009 at 09:59:43 (UTC)
Goto Top
@77559
Sollte in Zeile 08. am Ende nicht besser "%~1" stehen?
Yep - korrigiere ich gleich oben ...

Grüße
bastla
Member: derderkeineAhnunghat
derderkeineAhnunghat May 25, 2009 at 16:07:52 (UTC)
Goto Top
Moin,

ich habe es ausprobiert und muss sagen: klappt für das erste Verzeichnis (ich sag mal "Musik") hervorragend. In den Unterverzeichnissen funktioniert es aber nicht. Ich habe dann eine for Schleife gebastelt/kopiert, in der für jedes Unterverzeichnis makeThePlaylist aufgerufen wird. Ich komme aber nicht so ganz mit dem for Syntax klar. Ich hatte es auch mal mit for /R ... versucht, um jedes Unterverzeichnis durchzugehen - war nicht von Erfolg gekrönt.

Der Aufruf von makeThePlaylist erfolgt immer mit dem absoluten Pfad und in der Konsequenz sehen die mp3-Namen dann in den playlists der Unterverzeichnisse (z.B. Musik/ACDCACDC.pls) als ACDC/Highway to Hell.mp3. Da müsste dann noch das ACDC weg, da scheitere ich aber dran, weil ich auch den set Befehl nicht beherrsche... face-sad Ich mach da meinem Namen alle Ehre - meine Fortran77 Zeiten sind halt seit 10 Jahren vorbei und unter Unix sah das alles ganz anders aus.
Vielleicht erbarmt sich ja nochmal jemand.

::---snipp Playlist-maker-mit-Parameter-Startverzeichnis.bat
@echo off & setlocal EnableDelayedExpansion
If [%1]== (Echo %0: kein Startverzeichnis angegeben!) && goto :eof
CHCP 1252>nul

set "BasePath=%~f1\"  
PushD "%BasePath%"  
REM echo 0 %BasePath%
call :makeThePlaylist "%~nx1" "%~1"  
REM echo 1 %BasePath% III "%~nx1" "%~1"  
for /f "delims=" %%i in ('dir /b /s /A:d "%~1"') do (  
REM echo 2 %%~nxi III %%i
  call :makeThePlaylist "%%~nxi" "%%i"  
REM echo 3 %BasePath% III %%i III %%~nxi III %%i
set "BasePath=%%i\"  
)
PopD
goto :eof

:makeThePlayList
REM Playlist wird absolut zusammen gesetzt [pls]
set "pls=%~dp2%~1\%~1.pls"  
set "delPath=  
REM Parameter1 und Parameter2 können beide in Anführungszeichen kommen- also mit "%~1"/"%~2" Anfü-Zeichen wegfiltern  
set /a counter=0
for /R "%~2" %%i in (*.mp3) do set /a counter+=1  
If %counter%==0 goto :eof
echo [playlist]>"%pls%"  
(echo NumberOfEntries=%counter%)>>"%pls%"  
set /a counter=1
for /R "%~2" %%i in (*.mp3) do (  
    set "RelPath=%%~fi"  
REM echo 3 %RelPath% III %BasePath% III %1 %2
    set "RelPath=!RelPath:%BasePath%=!"  
    echo File!counter!=!RelPath!>>"%pls%"  
    echo Title!counter!=%%~ni>>"%pls%"  
    set /a counter+=1
)
goto :eof

Anbei noch ein Beispiel aus der "Back to Black.pls" im Verzeichnis "Musik/Amy/Back to Black"; ein Verzeichnis "Back to Black" existiert hier natürlich nicht.

File1=Back To Black\01-Rehab.mp3
Title1=01-Rehab
Member: bastla
bastla May 25, 2009 at 17:05:54 (UTC)
Goto Top
Hallo derderkeineAhnunghat!

Um tatsächlich in jedem Unterverzeichnis eine eigene Playlist zu erstellen (die dann wiederum alle in diesem Verzeichnis und in allen Unterverzeichnissen des betreffenden Verzeichnisses liegenden mp3-Files enthält), könnte das mit einer "aufgepropften" Schleife so aussehen:
::---snipp Playlist-maker-mit-Parameter-Startverzeichnis.bat
@echo off & setlocal EnableDelayedExpansion
If [%1]== (Echo %0: kein Startverzeichnis angegeben!) && goto :eof
CHCP 1252>nul

for /r "%~1" %%a in (.) do call :MakeThePlayListForThisDir "%%a"  
goto :eof

:MakeThePlayListForThisDir
set "BasePath=%~f1"  
if "%BasePath:~-1%" neq "\" set "BasePath=%BasePath%\"  
PushD "%BasePath%"  
call :makeThePlaylist "%~nx1" "%~1"  
PopD
goto :eof

:makeThePlayList
if "%~1" neq "" (set "plsName=%~dp2%~1\%~1") else (set "plsName=%~d2")  
if "%plsName:~-1%"==":" set "plsName=%plsName:~,-1%"  
set "pls=%plsName%.pls"  

REM Parameter1 und Parameter2 können beide in Anführungszeichen kommen- also mit "%~1"/"%~2" Anfü-Zeichen wegfiltern  
set /a counter=0
for /R "%~2" %%i in (*.mp3) do set /a counter+=1  
If %counter%==0 goto :eof

echo [playlist]>"%pls%"  
(echo NumberOfEntries=%counter%)>>"%pls%"  
set /a counter=1
for /R "%~2" %%i in (*.mp3) do (  
    set "RelPath=%%~fi"  
    set "RelPath=!RelPath:%BasePath%=!"  
    echo File!counter!=!RelPath!>>"%pls%"  
    echo Title!counter!=%%~ni>>"%pls%"  
    set /a counter+=1
)
goto :eof
Inkludiert sind hier noch kleinere Ergänzungen, um zB auch ein Rootverzeichnis als Startverzeichnis verwenden zu können und nicht eine ".pls" (also ohne Namen) als Ergebnis zu erhalten ...

Grüße
bastla