2016-09-26 128 views
0

我有一个批处理脚本( - >windows batch .bat automatic .m3u playlist creation/update)来自动生成播放列表。这些播放列表保存在rootdir的子文件夹中(请参阅代码)。 所以问题在于,播放列表中没有考虑子文件夹,因此无法找到音乐文件。我得到动态批处理脚本中的常量字符串

#EXTINF:???,The Realm Of Orzamar 
Dragon Age Origins\The Realm Of Orzamar.mp3 

我需要

#EXTINF:???,The Realm Of Orzamar 
../Dragon Age Origins\The Realm Of Orzamar.mp3 

并且用类似

SET "location='.../' + %%c" 

我得到

#EXTINF:???,The Realm Of Orzamar 
:\music\Dragon Age Origins\The Realm Of Orzamar.mp3 

我怎样才能把这个.../串入SET "location=%%c"所以它赢得“将被转换为music\。 absolut路径并不是一个解决方案,因为文件结构放置在便携式驱动器上,应该独立工作并且不在文件夹根目录下,因此可用于Android设备以及具有不同绝对路径的任何其他设备。 我对批处理没有经验,只是做了一些非常基本的东西到目前为止,我不太了解这个脚本,因为我不知道批处理语法。

在此先感谢。

代码:

CHCP 1252 
@ECHO Off 
SETLOCAL 

:: make a tempfile 
:maketemp 
SET "tempfile=%temp%\%random%" 
IF EXIST "%tempfile%*" (GOTO maketemp) ELSE (ECHO.>"%tempfile%a") 



:: Need the start of the tree to scan 
SET "rootdir=H:\music" 
>"%tempfile%b" (ECHO(%rootdir%&ECHO(*) 
FOR /f "delims=:" %%a IN ('FINDSTR /o /L "*" "%tempfile%b"') DO SET /a len=%%a-1 

SET "destfile=%~1" 

:loop 
SHIFT 
SET nextdir=%~1 
IF NOT DEFINED nextdir GOTO process 
IF %nextdir:~0,1%==\ (
PUSHD "%~1" 
FOR /f "delims=" %%a IN ('dir /b /s /a-d *.mp3 *.mp4 *.ogg *.m4a *.wma *.flac *.wav') DO >>"%tempfile%a" ECHO(%%~na:2:%%a 
) else (
PUSHD "%rootdir%\%~1" 
FOR /f "delims=" %%a IN ('dir /b /s /a-d *.mp3 *.mp4 *.ogg *.m4a *.wma *.flac *.wav') DO >>"%tempfile%a" ECHO(%%~na:%len%:%%a 
) 
POPD 
GOTO loop 

:process 
>%destfile% ECHO(#EXTM3U 
(
FOR /f "tokens=1,2*delims=:" %%a IN ('SORT "%tempfile%a"') DO (
ECHO(#EXTINF:???,%%a 
SET "location=%%c" 
SETLOCAL enabledelayedexpansion 
    ECHO(!location:~%%b! 
endlocal 
) 
)>>%destfile% 

del "%tempfile%*" 


GOTO :EOF 
+1

由于反斜杠在Windows中是标准的,因此不要使用正斜杠作为路径分隔符! – aschipfl

+0

我手动尝试'... \',但没有奏效。我需要去一个文件夹级别。到目前为止,只有'../'已经在做这项工作。 –

回答

0

解决它自己。我看着错误的线路。

SET "location=%%c" 
SETLOCAL enabledelayedexpansion 
    set "location=!location:~%%b!" 
    set "back=../" 
    ECHO(!back!!location! 

完成这项工作。 !location:~%%b!删除从完整绝对路径到文件夹根目录的前导字符,所以我只需在此之后添加我的字符​​串

+0

(将接受stackoverflow让我的答案,说我必须等待2天) –