将多个 .ttf 文件批量附加到一个 .mkv

Batch attachment of multiple .ttf files to a .mkv

好的,我对此完全陌生...基本上,我使用名为 mkvmerge 的工具将多个字体文件 (.ttf) 附加到 .mkv 文件。我已将 .mkv 文件与我要附加的相应字体一起放入文件夹中。

我的目标是创建一个批处理,创建一个包含所有添加附件的所有 .mkv 文件的副本,并将它们存放在父目录中新创建的文件夹(即 Revised)中。

从一个文件夹开始:

mkdir Revised

for %%A in (*.mkv) do "%mkvmerge%" -q -o "Revised\%%A" "%%A" --attachment-mime-type application/x-truetype-font --attach-file "%%~.ttf"

如果我将“%%~.ttf”更改为实际的 .tff 文件名,这将起作用 (即

mkdir Revised

    for %%A in (*.mkv) do "%mkvmerge%" -q -o "Revised\%%A" "%%A" --attachment-mime-type application/x-truetype-font --attach-file "sans serif.ttf"

我最终会得到新创建的 Revised 文件夹,其中包含一个 .mkv 文件,在 .mkv 文件本身中附加了 sans serif.tff 文件。 但是我想添加多个 .ttf 文件而不单独命名它们。 (在线搜索似乎我需要类似“$file”的东西,但我不知道如何使用它)

下一步,如果我有一个包含多个子文件夹的父文件夹:

mkdir Revised

for /R %%A in (*.mkv) do "%mkvmerge%" -q -o "Revised\%%A" "%%A" --attachment-mime-type application/x-truetype-font --attach-file "%%~.ttf"

这完全行不通。我确定不仅仅是因为“%%~.ttf”问题。

我知道这可能有点过于雄心勃勃,所以如果有人能帮助解决我问题的前半部分,那就太好了。非常感谢。

Ps:如有需要了解mkvmerge具体命令的朋友帮忙:https://mkvtoolnix.download/doc/mkvmerge.html

更新:第一部分

mkdir Revised

for %%x in (*.ttf) do (
for %%A in (*.mkv) do "%mkvmerge%" -q -o "Revised\%%A" "%%A" --attachment-mime-type application/x-truetype-font --attach-file "%%x"
)

它似乎工作得更好,但我认为脚本现在会添加和删除 .ttf 文件,直到文件夹中的最后一个 .ttf 文件保留下来。

请试一试。 (记得将您的 %mkvmerge% 变量设置为您的可执行文件路径):

@echo off
set "mkvmerge=C:\Some Path\mkvmerge.exe"
for %%a in (*.ttf) do (
    for /f %%i in ('dir /s /b /a-d *.mkv ^| findstr /vi Revised') do (
       if not exist "%%~dpiRevised" mkdir "%%~dpi\Revised"
       if not exist "%%~dpiRevised\%%~nxi" copy "%%~fi" "%%~dpiRevised"
       "%mkvmerge%" -q -o "%%~dpiRevised\%%~ni_rev%%~xi" "%%~dpiRevised\%%~nxi" --attachment-mime-type application/x-truetype-font --attach-file "%%~dpi%%a"
  )
)

所以解释一下你的例子出了什么问题:

在 for 循环中,您从根文件夹中的 mkv 获取应用,并向其应用 ttf 文件并创建新的 mkv 文件并附加 ttfRevised 目录,然后对于下一个 ttf 你再次从根目录复制,用新文件覆盖 Revised 目录中的 mkv 文件应用了新的 ttf

相反,我们需要先将 mkv 文件复制到 Revised 目录中,然后我们将第一个 ttf 文件应用于 Revised 中的自身,然后然后使用 mkv 和已经附加的 ttf 并应用另一个 ttf 直到所有 ttf 文件都已应用到 [= 内的新 mkv 16=] 原始 mkv 和所有 ttf 文件将保留在父文件夹中。

注意如果我解释的任何内容没有意义,请告诉我,我会重新措辞。

我决定尝试一下,它的目的是 运行 来自包含您的目录的父目录,(我假设这些目录都在同一个目录中级别,这不是通过嵌套目录递归).

请注意,我无法对此进行测试。

@Echo Off
Set "mkvm=%UserProfile%\Downloads\Video Players, Editors, & Downloaders\MKVTool Batch Modifier\mkvmerge.exe"
For /F Delims^=^ EOL^= %%A In ('Dir/B/AD 2^>Nul^|FindStr/IVXC:"Revised"'
) Do If Exist "%%A\*.mkv" (If Exist "%%A\*.ttf" (
        If Not Exist "Revised\" MD "Revised" 2>Nul||Exit /B
        Call :S1 "%%A"))
GoTo :EOF

:S1
PushD %1 2>Nul||Exit /B
Set "as=--attachment-mime-type application/x-truetype-font --attach-file"
Set "ttfs="
For /F Delims^=^ EOL^= %%A In ('Where .:*.ttf'
) Do Call Set "ttfs=%%ttfs%% %as% "%%~nxA""
For /F Delims^=^ EOL^= %%A In ('Where .:*.mkv'
) Do "%mkvm%" -q -o "%~dp0Revised\%%~nxA" "%%~nxA" %ttfs%
PopD

我想我也这样做了,允许一个目录中有多个 .mkv 文件,其中每个文件都将附加到所有相同的 .ttf 个文件。

Get-ChildItem *.mkv | ForEach-Object { 
        $FontFlags = ""
        Get-ChildItem -LiteralPath $_.BaseName -Exclude *.xml | ForEach-Object {
            $FontFlags += " --add-attachment `"$($_.FullName)`""
        }
        Write-Host "Running &`"C:\Program Files\MKVToolNix\mkvpropedit.exe`" `"$_`" $FontFlags"
        Invoke-Expression "&`"C:\Program Files\MKVToolNix\mkvpropedit.exe`" `"$_`" $FontFlags"
    }
    
    Read-Host "Press any key to exit..."

制作一个与mkv同名的文件夹,不带扩展名。将 mkv 文件、文件夹、这段代码放在同一个文件夹和 运行 它。

我没有编写此代码。我请人做了这个供我个人使用。