将子例程代码导入FOR循环

时间:2018-08-14 01:49:08

标签: windows batch-file variables

我有一个小的批处理文件,旨在从包含音轨的文件夹中读取文件名并将其输出到播放列表中。该程序运行良好,但是我无法将“写入轨道名称”代码放入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

1 个答案:

答案 0 :(得分:1)

@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时要使用的文件模式要多于1。
  • 建议不要将%%*用作for变量名,因为%*是脚本或称为标签的所有自变量。
  • 已将PLAYLIST名称删除,因为没有用。
  • 创建或擦除m3u文件,以防止在追加写入后复制文件名。