我有一个小批量文件,旨在从包含音轨的文件夹中读取文件名并将其输出到播放列表中。该程序运行良好,但是我无法将"写入曲目名称"代码放入 FOR 循环 - 我不得不将其保留为子例程,否则批处理文件将过早退出。有没有办法将这三行移动到 FOR 循环中?
@echo off
%~d1
cd %1
for %%* in (.) do set FOLDER="%%~nx*"
set PLAYLIST=%FOLDER%.m3u
for /f "tokens=*" %%g in ('dir /b *.flac *.mp3') do (
call :WRITE_TRACK_NAMES "%%g"
)
goto :CHECKOUT
:WRITE_TRACK_NAMES
set "TRACK=%~nx1"
echo %TRACK% >> %PLAYLIST%
goto :EOF
:CHECKOUT
exit /b
@echo off
setlocal
@rem Change drive and path.
cd /d %1
for /d %%A in (.) do set "FOLDER=%%~nxA"
@rem If in drive root, . is returned.
if "%FOLDER%" == "." exit /b 1
@rem Create m3u file or erase m3u file content.
2> "%FOLDER%.m3u" echo.
@rem Find and sort audio files and add filename to m3u file.
for /f "tokens=*" %%A in ('dir /b *.flac *.mp3 ^| sort') do >> "%FOLDER%.m3u" echo(%%~nxA
exit /b
- 使用
setlocal
可防止cd
和变量影响 CMD 进程的全局范围。 - 将
/d
参数与cd
一起使用允许在更改路径时切换驱动器。 - 使用
sort
,就像在dir
命令中使用多个文件模式一样。 - 建议不要使用
%%*
作为for
变量名,因为%*
都是脚本或称为标签的参数。 - 删除
PLAYLIST
名称,因为没有好用处。 - 创建或删除 m3u 文件,以防止在追加写入时重复文件名。