Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Batch - relativen Pfad filtern

Frage Entwicklung Batch & Shell

Mitglied: derderkeineAhnunghat

derderkeineAhnunghat (Level 1) - Jetzt verbinden

24.05.2009, aktualisiert 26.05.2009, 4550 Aufrufe, 5 Kommentare

HILFE

Hallo, habe unter https://www.administrator.de/index.php?content=41719 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

01.
::---snipp Playlist-maker-mit-Parameter-Startverzeichnis.bat 
02.
@echo off & setlocal EnableDelayedExpansion 
03.
If [%1]==[] (Echo %0: kein Startverzeichnis angegeben!) && goto :eof 
04.
CHCP 1252>nul 
05.
REM Hier will ich nur die Verzeichnisebene direkt unter Startverzeichnis, z.B. "c:\Eigene Musik" abfackeln 
06.
PushD "%~1" 
07.
REM Sowohl Ordner in dieser Verzeichnisebene darunter können Leerzeichen enthalten ["Hip Hop from Moldavia"] 
08.
REM und IMMER  habe das die Verzeichnisnamen im gesamten Pfad ["C:\Eigene Musik\Blasmusik"] 
09.
REM Also beide Parameter IMMER in Anführungszeichen. 
10.
REM Zuerst das Startverzeichnis selbst 
11.
REM for /d %%i in (*.*) do call :makeThePlaylist "." "." 
12.
REM und nun alle Ebenen darunter rekursiv... 
13.
 
14.
 
15.
 
16.
for /f "delims=" %%i in ('dir /b /s /A:d "%~1"') do ( 
17.
  call :makeThePlaylist "%%~nxi" "%%i" 
18.
19.
PopD 
20.
goto :eof 
21.
 
22.
:makeThePlayList 
23.
:: ---snipp Playlist-maker.bat: 
24.
echo %1 %2 
25.
set "pls=%~dp2%~1\%~1.pls" 
26.
set A=%2 
27.
set A=%A:%1=% 
28.
echo %A%  
29.
 
30.
REM Parameter1 und Parameter2 können beide in Anführungszeichen kommen- also mit "%~1"/"%~2" Anfü-Zeichen wegfiltern 
31.
set /a counter=0 
32.
for /R "%~2" %%i in (*.mp3) do set /a counter+=1 
33.
If %counter%==0 goto :eof 
34.
REM @ECHO pls: %pls% ; [%2];[%counter%] 
35.
@echo [playlist]>"%pls%" 
36.
(echo NumberOfEntries=%counter%)>>"%pls%" 
37.
set /a counter=1 
38.
for /R  "%~2" %%i in (*.mp3) do ( 
39.
  echo File!counter!=%%i>>"%pls%" 
40.
  echo Title!counter!=%%~ni>>"%pls%" 
41.
  set /a counter+=1 
42.
43.
goto :eof


[Edit Biber] Code in Code-Tags gesetzt. [/Edit]
Mitglied: bastla
24.05.2009 um 11:35 Uhr
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:
01.
::---snipp Playlist-maker-mit-Parameter-Startverzeichnis.bat 
02.
@echo off & setlocal EnableDelayedExpansion 
03.
If [%1]==[] (Echo %0: kein Startverzeichnis angegeben!) && goto :eof 
04.
CHCP 1252>nul 
05.
 
06.
set "BasePath=%~f1\" 
07.
PushD "%BasePath%" 
08.
call :makeThePlaylist "%~nx1" "%~1" 
09.
PopD 
10.
goto :eof 
11.
 
12.
:makeThePlayList 
13.
set "pls=%~dp2%~1\%~1.pls" 
14.
 
15.
REM Parameter1 und Parameter2 können beide in Anführungszeichen kommen- also mit "%~1"/"%~2" Anfü-Zeichen wegfiltern 
16.
set /a counter=0 
17.
for /R "%~2" %%i in (*.mp3) do set /a counter+=1 
18.
If %counter%==0 goto :eof 
19.
 
20.
echo [playlist]>"%pls%" 
21.
(echo NumberOfEntries=%counter%)>>"%pls%" 
22.
set /a counter=1 
23.
for /R "%~2" %%i in (*.mp3) do ( 
24.
    set "RelPath=%%~fi" 
25.
    set "RelPath=!RelPath:%BasePath%=!" 
26.
    echo File!counter!=!RelPath!>>"%pls%" 
27.
    echo Title!counter!=%%~ni>>"%pls%" 
28.
    set /a counter+=1 
29.
30.
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]
Bitte warten ..
Mitglied: LotPings
24.05.2009 um 11:57 Uhr
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
Bitte warten ..
Mitglied: bastla
24.05.2009 um 11:59 Uhr
@LotPings
Sollte in Zeile 08. am Ende nicht besser "%~1" stehen?
Yep - korrigiere ich gleich oben ...

Grüße
bastla
Bitte warten ..
Mitglied: derderkeineAhnunghat
25.05.2009 um 18:07 Uhr
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... 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.

01.
::---snipp Playlist-maker-mit-Parameter-Startverzeichnis.bat 
02.
@echo off & setlocal EnableDelayedExpansion 
03.
If [%1]==[] (Echo %0: kein Startverzeichnis angegeben!) && goto :eof 
04.
CHCP 1252>nul 
05.
 
06.
set "BasePath=%~f1\" 
07.
PushD "%BasePath%" 
08.
REM echo 0 %BasePath% 
09.
call :makeThePlaylist "%~nx1" "%~1" 
10.
REM echo 1 %BasePath% III "%~nx1" "%~1" 
11.
for /f "delims=" %%i in ('dir /b /s /A:d "%~1"') do ( 
12.
REM echo 2 %%~nxi III %%i 
13.
  call :makeThePlaylist "%%~nxi" "%%i" 
14.
REM echo 3 %BasePath% III %%i III %%~nxi III %%i 
15.
set "BasePath=%%i\" 
16.
17.
PopD 
18.
goto :eof 
19.
 
20.
:makeThePlayList 
21.
REM Playlist wird absolut zusammen gesetzt [pls] 
22.
set "pls=%~dp2%~1\%~1.pls" 
23.
set "delPath= 
24.
REM Parameter1 und Parameter2 können beide in Anführungszeichen kommen- also mit "%~1"/"%~2" Anfü-Zeichen wegfiltern 
25.
set /a counter=0 
26.
for /R "%~2" %%i in (*.mp3) do set /a counter+=1 
27.
If %counter%==0 goto :eof 
28.
echo [playlist]>"%pls%" 
29.
(echo NumberOfEntries=%counter%)>>"%pls%" 
30.
set /a counter=1 
31.
for /R "%~2" %%i in (*.mp3) do ( 
32.
    set "RelPath=%%~fi" 
33.
REM echo 3 %RelPath% III %BasePath% III %1 %2 
34.
    set "RelPath=!RelPath:%BasePath%=!" 
35.
    echo File!counter!=!RelPath!>>"%pls%" 
36.
    echo Title!counter!=%%~ni>>"%pls%" 
37.
    set /a counter+=1 
38.
39.
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
Bitte warten ..
Mitglied: bastla
25.05.2009 um 19:05 Uhr
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:
01.
::---snipp Playlist-maker-mit-Parameter-Startverzeichnis.bat 
02.
@echo off & setlocal EnableDelayedExpansion 
03.
If [%1]==[] (Echo %0: kein Startverzeichnis angegeben!) && goto :eof 
04.
CHCP 1252>nul 
05.
 
06.
for /r "%~1" %%a in (.) do call :MakeThePlayListForThisDir "%%a" 
07.
goto :eof 
08.
 
09.
:MakeThePlayListForThisDir 
10.
set "BasePath=%~f1" 
11.
if "%BasePath:~-1%" neq "\" set "BasePath=%BasePath%\" 
12.
PushD "%BasePath%" 
13.
call :makeThePlaylist "%~nx1" "%~1" 
14.
PopD 
15.
goto :eof 
16.
 
17.
:makeThePlayList 
18.
if "%~1" neq "" (set "plsName=%~dp2%~1\%~1") else (set "plsName=%~d2") 
19.
if "%plsName:~-1%"==":" set "plsName=%plsName:~,-1%" 
20.
set "pls=%plsName%.pls" 
21.
 
22.
REM Parameter1 und Parameter2 können beide in Anführungszeichen kommen- also mit "%~1"/"%~2" Anfü-Zeichen wegfiltern 
23.
set /a counter=0 
24.
for /R "%~2" %%i in (*.mp3) do set /a counter+=1 
25.
If %counter%==0 goto :eof 
26.
 
27.
echo [playlist]>"%pls%" 
28.
(echo NumberOfEntries=%counter%)>>"%pls%" 
29.
set /a counter=1 
30.
for /R "%~2" %%i in (*.mp3) do ( 
31.
    set "RelPath=%%~fi" 
32.
    set "RelPath=!RelPath:%BasePath%=!" 
33.
    echo File!counter!=!RelPath!>>"%pls%" 
34.
    echo Title!counter!=%%~ni>>"%pls%" 
35.
    set /a counter+=1 
36.
37.
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Per Batch Winrar entpacken - Probleme bei Pfad (7)

Frage von Concurve zum Thema Batch & Shell ...

Datenbanken
Access Checkbox mit Kombifeld und dann filtern

Frage von atomas42 zum Thema Datenbanken ...

Batch & Shell
Batch zum bearbeiten mehrerer CSV (2)

Frage von Matzus87 zum Thema Batch & Shell ...

Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...