我有一个文件夹,其中包含:
- TVShow - 第 01 集.mkv
- TVShow - 第 01 集.srt
- TVShow - 第 02 集.mkv
- TVShow - 第 02 集.srt
- TVShow - 第 03 集.mkv
- TVShow - 第 03 集.srt
等等...
我已经知道我可以用 MKVMerge 逐个执行此操作。这会花费相当多的时间,所以...我想制作一个批处理脚本,可以使用 MKVToolNix、mkvmerge 或类似程序对文件夹中的所有文件执行此操作。
我还需要批处理脚本是相对的,以便以后当文件名不同时可以应用该脚本。文件名可能不总是“TVShow”,而是“Second TV Show”。
1. 我想将外部字幕文件(srt)混编到相应的电影文件(mkv)中。
2. 我还想将字幕设为相应电影文件的默认和强制字幕。
我怎样才能制作这样的批处理脚本?我对批处理脚本有一些了解,我在 Google 上搜索了几个小时,却没有找到任何有用的信息。
我开始用这个,但它不起作用,也没有将字幕设置为默认或强制:
"B:\OneDrive\Portable applications\mkvtoolnix\mkvmerge.exe" "FOR %%A IN (*.mkv) DO mkvmerge -o "remux-%%~nA.mkv" "%%~A" "%%~dpnA.srt"
答案1
for %%A IN (*.mkv) do (
"B:\OneDrive\Portable applications\mkvtoolnix\mkvmerge.exe" -o "remux-%%~nxA" "%%~A" "%%~nA.srt"
echo Replace this Line with your othr commands!
)
答案2
我在另一个答案中找到一个很好的例子[1],使用下面的一般草图:
for %%f in (*.mkv) do (
echo %%~nf
mkvmerge -o "%%~nf_New.mkv" "%%~nf_New.mkv" --language 0:eng "%%~nf.srt"
)
我在 mkvmerge 网站上找到了更类似的例子[2]
mkvmerge -o with-lang-codes.mkv --language 2:ger --language 3:dut \
--default-track 3 without-lang-codes.mkv --language 0:eng english.srt \
--default-track 0 --language 0:fre french.srt
你放进去循环for
,在单一情况下工作的命令行,使用 更改 mkv 文件 %%~nf.mkv
并使用 更改 srt %%~nf.srt
以及在正确的位置更改所有选项。
答案3
我遇到了与您相同的问题,并整理了以下 PowerShell 脚本以实现字幕的批量混合。
#Batch Merge Subtitles with MKVMerge - Iain McCain
#Set MKVMerge.exe Path
$MKVMerge = 'C:\Program Files\MKVToolNix\mkvmerge.exe'
#Set Target
$Directory = "Z:\Films\"
#Set Subtitle Extension
$SubExtension = 'eng.srt'
#Process
$Subs = Get-ChildItem $Directory -Filter "*.$SubExtension" -Recurse | % { $_.FullName } | Sort-Object
$Count = $Subs.count
Write-Host "$Count MKV's to be processed."
Foreach ($Sub in $Subs)
{
#Get File Name
$FormatName = $Sub.ToString()
$Name = $FormatName.TrimEnd(".$SubExtension")
$MKV = $Name + '.mkv'
#Set Output File Name
$Output = $Name + '___MERGED' + '.mkv'
#Execute
& $MKVMerge -o "$Output" --default-track "0" --language "0:eng" "$Sub" "$MKV"
#Clean Up
Remove-Item $MKV
Remove-Item $Sub
Rename-Item $Output -NewName $MKV
}
答案4
以上所有代码的编辑均归功于 Ian McCain。
TrimEnd 是逐个字母而不是字符串进行处理,因此任何以扩展名中的字母结尾的文件都会导致失败。由于脚本不检查错误,因此即使发生阻止创建多路复用文件的错误,也会删除 sub 和 mkv 文件。这可能会导致数据丢失。
我需要使用脚本将 idx/sub 文件合并到我的 MKV 而不是 srt 文件中,并且它们的名称与视频文件相同,但扩展名为 .sub 和 .idx,而不是 .mkv。我还添加了错误检查,因此如果由于某些错误而未创建 ___MERGED 文件,则不会删除/重命名任何文件。这是我完成的解决方案。
#Batch Merge Subtitles with MKVMerge - Iain McCain
#Set MKVMerge.exe Path
$MKVMerge = 'C:\Program Files\MKVToolNix\mkvmerge.exe'
#Set Target
$Directory = "Z:\Movies\"
#Set Subtitle Extension
$SubExtension = 'idx'
$SecondSubExtension = "sub"
#Process
$Subs = Get-ChildItem $Directory -Filter "*.$SubExtension" -Recurse | % { $_.FullName } | Sort-Object
$Count = $Subs.count
Write-Host "$Count MKV's to be processed."
Foreach ($Sub in $Subs) {
#Get File Name
$FormatName = $Sub.ToString()
#$Name = $FormatName.TrimEnd(".$SubExtension")
$Name = $FormatName.Substring(0,$FormatName.Length-($SubExtension.Length+1))
$MKV = $Name + '.mkv'
$OtherSub = $Name + '.' + $SecondSubExtension
#Set Output File Name
$Output = $Name + '___MERGED' + '.mkv'
#Execute
& $MKVMerge -o "$Output" --default-track "0" --language "0:eng" "$Sub" "$MKV"
If (Test-Path $Output) {
#Clean Up
Remove-Item $MKV
Remove-Item $Sub
Remove-Item $OtherSub
Rename-Item $Output -NewName $MKV
} Else {
write-host "NON-EXISTANT - $Output" -foreground "red"
"NON-EXISTANT - $Output" | Out-File $Directory + "Errors.txt" -Append
}
}