[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 【已解决】请教批处理MKV单次命令行-变量-加入循环命令遇到的问题

本帖最后由 c_mang 于 2022-4-10 17:06 编辑

现有两版剧集视频文件,需采日版视频+中版双音频及字幕重新封装为MKV。
据网上教程步骤:
一:获取的单次任务处理的命令行
"C:\Program Files (x86)\MKVToolNix\mkvmerge.exe" -o "E:\\日版\\01.mkv"  "--forced-track" "0:no" "-d" "0" "-A" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "E:\\日版\\01.mp4" ")" "--language" "1:chi" "--track-name" "1:国语" "--default-track" "1:yes" "--forced-track" "1:no" "--language" "2:jpn" "--track-name" "2:日语" "--default-track" "2:no" "--forced-track" "2:no" "--language" "3:chi" "--track-name" "3:中字" "--default-track" "3:yes" "--forced-track" "3:no" "-a" "1,2" "-s" "3" "-D" "-T" "--no-global-tags" "--no-chapters" "(" "E:\\中版\\01.mkv" ")" "--track-order" "0:0,1:1,1:2,1:3"

二:将具体文件名变成变量。
  1. @echo off
  2. set topath="E:\\日版\\"
  3. set frompath=""E:\\日版\\"
  4. set frompath1="E:\\中版\\"
  5. "C:\Program Files (x86)\mkvtoolnix\mkvmerge.exe" -o "%topath%01.mkv"  "--forced-track" "0:no" "-d" "0" "-A" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "E:\\日版\\01.mp4" ")" "--language" "1:chi" "--track-name" "1:国语" "--default-track" "1:yes" "--forced-track" "1:no" "--language" "2:jpn" "--track-name" "2:日语" "--default-track" "2:no" "--forced-track" "2:no" "--language" "3:chi" "--track-name" "3:中字" "--default-track" "3:yes" "--forced-track" "3:no" "-a" "1,2" "-s" "3" "-D" "-T" "--no-global-tags" "--no-chapters" "(" "%frompath1%01.mkv" ")" "--track-order" "0:0,1:1,1:2,1:3"
复制代码
——粘贴到命令提示符运行成功

三:加入循环命令。
  1. @echo off
  2. set topath="E:\\日版\\"
  3. set frompath=""E:\\日版\\"
  4. set frompath1="E:\\中版\\"
  5. pushd %frompath%
  6. for /f "tokens=*" %%i in ('dir/b *.mp4') do (call :merge %topath%%%~ni".mkv"   %frompath%%%i   %frompath1%%%i
  7. pause
  8. :merge
  9. "C:\Program Files (x86)\mkvtoolnix\mkvmerge.exe" -o "%1"  "--forced-track" "0:no" "-d" "0" "-A" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "%2" ")" "--language" "1:chi" "--track-name" "1:国语" "--default-track" "1:yes" "--forced-track" "1:no" "--language" "2:jpn" "--track-name" "2:日语" "--default-track" "2:no" "--forced-track" "2:no" "--language" "3:chi" "--track-name" "3:中字" "--default-track" "3:yes" "--forced-track" "3:no" "-a" "1,2" "-s" "3" "-D" "-T" "--no-global-tags" "--no-chapters" "(" "%3" ")" "--track-order" "0:0,1:1,1:2,1:3"
  10. )
复制代码
——报错:
pushd %frompath%
for /f "tokens=*" %%i in ('dir/b *.mp4') do (call :merge %topath%%%~ni".mkv"   %frompath%%%i   %frompath1%%%i
此时不应有 %%i。
期待高手指点,谢谢!

回复 1# c_mang


子函数需要放在for循环外面
  1. @echo off
  2. set topath="E:\\日版\\"
  3. set frompath="E:\\日版\\"
  4. set frompath1="E:\\中版\\"
  5. pushd %frompath%
  6. for /f "tokens=*" %%i in ('dir /b *.mp4') do (
  7.     call :merge %topath%%%~ni".mkv" %frompath%%%i %frompath1%%%i
  8.     pause
  9. )
  10. goto :eof
  11. :merge
  12. "C:\Program Files (x86)\mkvtoolnix\mkvmerge.exe" -o "%1"  "--forced-track" "0:no" "-d" "0" "-A" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "%2" ")" "--language" "1:chi" "--track-name" "1:国语" "--default-track" "1:yes" "--forced-track" "1:no" "--language" "2:jpn" "--track-name" "2:日语" "--default-track" "2:no" "--forced-track" "2:no" "--language" "3:chi" "--track-name" "3:中字" "--default-track" "3:yes" "--forced-track" "3:no" "-a" "1,2" "-s" "3" "-D" "-T" "--no-global-tags" "--no-chapters" "(" "%3" ")" "--track-order" "0:0,1:1,1:2,1:3"
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 2# Batcher
另存bat运行——
mkvmerge v6.0.0 ('Coming Up For Air') built on Jan 20 2013 09:52:00
Error: The file 'E:\\中版\01.mp4' could not be opened for reading: open file error.
请按任意键继续. . .

TOP

回复 3# c_mang


我只是修正了你代码里面的语法错误,别的没改。
你确认一下 E:\\中版\01.mp4 是否存在?
为什么你的代码里面定义变量的时候都是两个\呢?有啥特殊要求吗
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 c_mang 于 2022-4-9 20:16 编辑

回复 4# Batcher
感谢老大亲自指点!
"E:\中版\01.mkv"——这是现复制的中版第一话路径。
变量的时候都是两个\
这是照搬来的,我是初学。
我忽略了,日版视频是MP4+中版双音频及字幕是MKV。
如何修正?

TOP

回复 5# c_mang


你试试都改成一个\会是啥情况呢?
日版视频是MP4+中版双音频及字幕是MKV。

我看不懂你的实际需求,能否给个真实的例子?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 6# Batcher
让您费心了!
准备的素材:
1,E:\\动漫类\\外国卷\\东映 三国志\\横山光輝 三国志 全47話\\[日版仅视频]横山光輝 三国志 全47話640x480\\横山光輝 三国志 第01話 「桃園の誓い」.mp4【共47话】
2,E:\\动漫类\\外国卷\\东映 三国志\\横山光輝 三国志 全47話\\横山光辉-三国志-47话-[国日双语]含 (720x480vobsub) 字幕\\横山光辉三国志EP01(国日双语)桃园三结义.mkv【共47话】
由于MKV单次任务处理的命令行可以将素材1的视频与素材2的两规音频+1轨字幕(其余的删除)混装为新的MKV文件,于是想用批处理一次性完成47话的封装。
因原文件所在路径较长,又兼日语、简繁交错文件名,故更改文件名为序号标识,再移动至E盘根目录下。
不知是不是没有区分素材1的视频是.mp4后缀,而素材2是.mkv所导致问题的出现?

TOP

回复 7# c_mang


不好意思,我没有从事过你这么专业的工作,所以还是不太清楚。
你试试把用以下代码(不要做任何增删改)处理这例子里面的文件,然后截图发出来我看看。
  1. set topath="E:\日版\"
  2. set frompath="E:\日版\"
  3. set frompath1="E:\中版\"
  4. pushd %frompath%
  5. for /f "tokens=*" %%i in ('dir /b *.mp4') do (
  6.     call :merge %topath%%%~ni".mkv" %frompath%%%i %frompath1%%%i
  7.     pause
  8. )
  9. goto :eof
  10. :merge
  11. "C:\Program Files (x86)\mkvtoolnix\mkvmerge.exe" -o "%1"  "--forced-track" "0:no" "-d" "0" "-A" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "%2" ")" "--language" "1:chi" "--track-name" "1:国语" "--default-track" "1:yes" "--forced-track" "1:no" "--language" "2:jpn" "--track-name" "2:日语" "--default-track" "2:no" "--forced-track" "2:no" "--language" "3:chi" "--track-name" "3:中字" "--default-track" "3:yes" "--forced-track" "3:no" "-a" "1,2" "-s" "3" "-D" "-T" "--no-global-tags" "--no-chapters" "(" "%3" ")" "--track-order" "0:0,1:1,1:2,1:3"
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 8# Batcher
折腾半天截图上传不了,这是文字拷贝——

C:\Program Files (x86)\MKVToolNix>set topath="E:\日版\"

C:\Program Files (x86)\MKVToolNix>set frompath="E:\日版\"

C:\Program Files (x86)\MKVToolNix>set frompath1="E:\中版\"

C:\Program Files (x86)\MKVToolNix>pushd "E:\日版\"

E:\日版>for /F "tokens=*" %i in ('dir /b *.mp4') do (
call :merge "E:\日版\"%~ni".mkv" "E:\日版\"%i "E:\中版\"%i
pause
)

E:\日版>(
call :merge "E:\日版\"01".mkv" "E:\日版\"01.mp4 "E:\中版\"01.mp4
pause
)

E:\日版>"C:\Program Files (x86)\mkvtoolnix\mkvmerge.exe" -o ""E:\日版\"01".mkv""  "--forced-track" "0:no" "-d" "0" "-A" "-S" "-T" "--no-global-tags" "--no-chapters" "(" ""E:\日版\"01.mp4" ")" "--language" "1:chi" "--track-name" "1:国语" "--default-track" "1:yes" "--forced-track" "1:no" "--language" "2:jpn" "--track-name" "2:日语" "--default-track" "2:no" "--forced-track" "2:no" "--language" "3:chi" "--track-name" "3:中字" "--default-track" "3:yes" "--forced-track" "3:no" "-a" "1,2" "-s" "3" "-D" "-T" "--no-global-tags" "--no-chapters" "(" ""E:\中版\"01.mp4" ")" "--track-order" "0:0,1:1,1:2,1:3"
mkvmerge v6.0.0 ('Coming Up For Air') built on Jan 20 2013 09:52:00
Error: The closing parenthesis ')' are missing.
请按任意键继续. . .

TOP

本帖最后由 c_mang 于 2022-4-9 22:52 编辑

https://data.kexinshe.com:9000/sticker/1020090

TOP

回复 4# Batcher
根据您的指点:你确认一下 E:\\中版\01.mp4 是否存在?
查:我的恰恰是"E:\\中版\\01.MKV"
为此,
我找到了操作思路参考的旧贴原文——

[影音合成] 关于mkvtoolnix批量处理的经验分享
原文地址:https://www.deainx.me/forum.php? ... D%D1%E9%B7%D6%CF%ED

原贴是:
set frompath="D:\\comic\\Dragon.Ball\\cc\\"
set frompath1="D:\\comic\\Dragon.Ball\\aa\\"
pushd %frompath%
for /f "tokens=*" %%i in ('dir/b *.mkv') do call :merge %topath%%%~ni".mkv" %frompath%%%i %frompath1%%%i %frompath1%%%~ni".ssa"
分析:
set frompath=包含视频音频,MKV后缀
set frompath1=仅一轨字幕文件,ssa后缀

而我的素材:
set frompath=""E:\\日版\\"——仅视频(无音频),MP4后缀
set frompath1="E:\\中版\\"——勾选国语、日语两条音轨和vobsub字幕,MKV后缀

pushd %frompath%
for /f "tokens=*" %%i in ('dir/b *.mp4') do (call :merge %topath%%%~ni".mkv"   %frompath%%%i   %frompath1%%%i

——如何认可"E:\\中版\\01.MKV"呢?

TOP

回复 9# c_mang


Q-07:怎样把CMD窗口里的结果复制出来?
http://bbs.bathome.net/thread-3473-1-1.html

从这个报错信息来推测,有可能是双引号不配对导致的错误,你把这个代码的执行结果再发出来看看:
  1. set "topath=E:\日版"
  2. set "frompath=E:\日版"
  3. set "frompath1=E:\中版"
  4. pushd %frompath%
  5. for /f "tokens=*" %%i in ('dir /b *.mp4') do (
  6.     call :merge "%topath%\%%~ni.mkv" "%frompath%\%%i" "%frompath1%\%%i"
  7.     pause
  8. )
  9. goto :eof
  10. :merge
  11. "C:\Program Files (x86)\mkvtoolnix\mkvmerge.exe" -o "%~1"  "--forced-track" "0:no" "-d" "0" "-A" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "%~2" ")" "--language" "1:chi" "--track-name" "1:国语" "--default-track" "1:yes" "--forced-track" "1:no" "--language" "2:jpn" "--track-name" "2:日语" "--default-track" "2:no" "--forced-track" "2:no" "--language" "3:chi" "--track-name" "3:中字" "--default-track" "3:yes" "--forced-track" "3:no" "-a" "1,2" "-s" "3" "-D" "-T" "--no-global-tags" "--no-chapters" "(" "%~3" ")" "--track-order" "0:0,1:1,1:2,1:3"
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 9# c_mang


你用这个方法上传截图的时候遇到什么问题了吗:
http://bbs.bathome.net/thread-60985-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 13# Batcher
截图过来了

TOP

回复 12# Batcher
如果"E:\中版\01.mp4"改为"E:\中版\01.MKV"似乎就可以了。

TOP

返回列表