批量合并文件夹和子文件夹中的视频文件
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
)
)
理想情况下,只扫描一次子文件夹并只保留不重复的路径。
我有大约 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
)
)
理想情况下,只扫描一次子文件夹并只保留不重复的路径。