我目前正在尝试将外部字幕文件(.ass 文件)合并到 mkv 文件中,但遇到循环问题。
我最近的尝试是:
set mkvmerge="C:\Program Files\MKVToolNix\mkvmerge.exe"
set output_folder=G:\tada kun\muxed
set counter = 01
set test='G:\tada kun\subs\\[Kaya] Tada-Kun Wa Koi O Shinai - %counter% (Bd 1080P X.265 Flac).ass'
for /r %%a in (*.mkv) do call %mkvmerge% -o "%output_folder%\%%~na.mkv" --audio-tracks 1 --language 0:jpn --default-track 0:yes --language 1:jpn --default-track 1:yes "%%a" --language 0:eng --default-track 0:yes "%test%" --attachment-name OpenSans-Semibold.ttf --attach-file ^"G:\tada kun\OpenSans-Semibold.ttf^" --track-order 0:0,0:1,1:0
我不确定如何在这里增加计数器,但主要问题是当我调用测试变量时计数器不显示。任何帮助都将不胜感激。
答案1
counter
当我调用测试变量时没有显示。
set counter = 01
这将创建一个名为counter
(注意尾随空格)的变量。
正确的做法是:
set counter=01
为了满足值可能包含空格的情况:
set "counter=01"
但是,在您的情况下(使用计数器),您需要使用不同形式set
:
set /a counter=0
Where/a
允许您对变量使用算术表达式。
我不确定counter
这里如何增加。
使用:
set /a counter+=1
要检索该值有点棘手。首先,您必须使用以下方法启用延迟扩展:
setlocal enabledelayedexpansion
这允许在执行时而不是解析时评估变量。如果不这样做,循环中的变量将扩展为初始值而不是更新的值。
!counter!
然后检索您用来代替的值%counter%
。
使用时,在!counter!
每次执行该行时或for
循环中的每个循环中都会执行扩展。
综合起来
@echo off
setlocal enabledelayedexpansion
set mkvmerge="C:\Program Files\MKVToolNix\mkvmerge.exe"
set output_folder=G:\tada kun\muxed
set /a counter=0
for /r %%a in (*.mkv) do (
set "test=G:\tada kun\subs\\[Kaya] Tada-Kun Wa Koi O Shinai - !counter! (Bd 1080P X.265 Flac).ass"
%mkvmerge% -o "%output_folder%\%%~na.mkv" --audio-tracks 1 --language 0:jpn --default-track 0:yes --language 1:jpn --default-track 1:yes "%%a" --language 0:eng --default-track 0:yes "!test!" --attachment-name OpenSans-Semibold.ttf --attach-file ^"G:\tada kun\OpenSans-Semibold.ttf^" --track-order 0:0,0:1,1:0
set /a counter+=1
)
endlocal
笔记:
set test...
已被移至for
循环内部并"
使用 s 代替'
s。"%test%"
已被替换为"!test!"
使用延迟(执行)时间扩展