每次需要混合 .mkv 文件时,它都会附带随机数量的字幕,并且每个字幕都是不同的语言代码。
所以例如 场景一:
video.mkv
eng.srt
fre.srt
ger.srt
场景2:
video.mkv
rus.srt
spa.srt
目标是每次运行相同的批处理文件,使其获取一定数量的字幕并使用正确的语言代码等正确混合。
到目前为止我们已经到了这里:
EnableDelayedExpansion
for %%A in ("*.srt") do (
set subtitle=%%~nA
)
for %%A in ("*.mkv") do (
mkvmerge.exe -o "%%~nA.mkv" --default-track 0:yes "%%A"^
--language 0:!subtitle! --default-track 0:no "!subtitle!.srt"^
--language 0:!subtitle! --default-track 0:no "!subtitle!.srt"^
--language 0:!subtitle! --default-track 0:no "!subtitle!.srt"^
)
到目前为止,这是固定数量的字幕方法,而不是动态的,所以例如场景 1。它几乎可以工作,只是它将每个字幕作为最后一个变量,因此从场景 1 开始,每个字幕被混合三次,并命名为
ger
表示语言,ger.srt
用作源三次,因为它是场景中的最后一个。按字母顺序列出。
目标:每个
!subtitle!
应该是正确的语言和字幕,正如我对字母表的理解。
我没有安装
mkvmerge.exe
并且我没有阅读 mkvmerge 的 文档,所以不知道所提供的选项是否真的正确。
下面的批处理文件根据当前目录中找到的
--language
文件创建具有可变数量 --default-track
和 .srt
选项的命令行。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SubtitleOptions="
setlocal EnableDelayedExpansion
for %%I in (*.srt) do set "SubtitleOptions=!SubtitleOptions! --language 0:%%~nI --default-track 0:no "%%I""
endlocal & set "SubtitleOptions=%SubtitleOptions%"
for %%I in (*.mkv) do mkvmerge.exe -o "%%I" --default-track 0:yes "%%I"%SubtitleOptions%
endlocal
请阅读此答案,了解有关命令 SETLOCAL 和 ENDLOCAL 的详细信息,以及 使用 Windows 批处理文件的单行多个命令,了解在命令行上使用
ENDLOCAL设置操作符
&
的说明具有延迟扩展的批处理文件的初始环境中的变量 SubtitleOptions
也无法正确处理文件名中带有 .mkv
的 !
文件。
分配给环境变量
SubtitleOptions
的字符串始终以空格字符开头(如果已定义),这就是为什么在命令行上执行%SubtitleOptions%
时,"%%I"
直接位于mkvmerge.exe
之后。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
echo /?
endlocal /?
for /?
set /?
setlocal /?