批量合并文件夹和子文件夹中的视频文件

Batch combine video files in a folder and subfolders

我有大约 200 个文件夹,里面装满了 MPG 拆分文件。我想将每个文件夹的文件连接在一起。我在 Whosebug 的其他问题中找到了这个 BATCH 脚本。

@echo off &setlocal enabledelayedexpansion
cd /d "%sourcefolder%"
set "line="
for %%a in (*.mpg) do set line=!line! +"%%~a"
"C:\Program Files\MKVToolNix\mkvmerge.exe" -o "Output.mkv" %line:~2%

Combine mkv's in Windows (automated, not using a GUI)

效果很好,但问题是,我必须将 .bat 文件粘贴到大约 200 个文件夹中,然后 运行 粘贴大约 200 次。

有人可以帮助我吗?我如何 运行 这个文件从根文件夹到 merge/join 子文件夹中的所有文件,并在每个子文件夹中创建新的 "output.mkv" 文件或创建一个新文件夹,如“/OutputVideos”,可能有名称中的数字增量或与子文件夹同名。

非常感谢您的帮助。谢谢

  • 使用for循环通过子目录/r递归枚举/d
  • 将工作目录更改为循环变量
  • 枚举 .mpg 个文件并将名称连接到一个变量中(使用 delayed expansion
  • 用那个变量调用mkvmerge(注意它以space和+开头所以我们应该从索引2开始提取它的内容,索引是从0开始的意味着第一个字符有索引 0 而我们需要的第三个字符有索引 2)

将代码放在基础文件夹的 concatenate.bat 文件中,批处理文件将处理所有子文件夹。

@echo off
setlocal enableDelayedExpansion

set mkvmerge="C:\Program Files\MKVToolNix\mkvmerge.exe"

for /d /r %%D in (*) do (
    pushd %%D
    set files=
    for %%F in (*.mpg) do set files=!files! + ^( "%%F" ^)
    if not "!files!"=="" %mkvmerge% -o "output.mkv" !files:~2!
    popd
)
pause

我试过 ,但我发现它更快:

@echo off
setlocal enableDelayedExpansion

for /f "delims=" %%d in ('dir /b /s /ad') do (
    set files=
    if exist %%d\*.mpg (
      pushd %%d
      for /f "delims=" %%f in ('dir /b /a-d "%%d\*.mpg"') do (
        set files=!files! "%%f"
      )
    echo !files!
    popd
    )
)

理想情况下,只扫描一次子文件夹并只保留不重复的路径。