如何解决Remux MKV 在批处理文件中使用 mkvmerge 删除字幕和不需要的音轨
我正在创建一个 Windows 批处理文件来查找文件夹中的所有 mkv 文件,检查它是否有多个音轨和字幕。如果是,请删除除 ENG 和 UND 之外的所有字幕和所有音轨。但是,当我运行批处理文件时它会崩溃吗?我不知道为什么它开始这样做。另外变量之前没有设置。干净总是假的。请帮忙。
@echo on
setlocal ENABLEDELAYEDEXPANSION
set rootfolder="C:\Users\User\Desktop\mov"
set "clean=false"
echo Enumerating all MKVs under %rootfolder%
for /r %rootfolder% %%a in (*.mkv) do (
for /f %%s in ('mkvmerge -i "%%a" ^| find /c /i "subtitles"') do (
if NOT [%%s]==[0] (
set "clean=true"
)
)
for /f %%b in ('mkvmerge -i "%%a" ^| find /c /i "audio"') do (
if [%%b]gtr[1] (
set "clean=true"
)
)
if %clean%=="true" (
mkvmerge -o "%%~dpna (clean)%%~xa" -a und,eng -s und,eng --no-subtitles "%%a"
)
)
echo Done
pause
解决方法
不幸的是,你没有提到任何错误信息,所以我所能做的就是提出一些(我希望是建设性的)批评。
set rootfolder="C:\Users\User\Desktop\mov"
set "clean=false"
此标签通常首选第二种格式,因此
set "rootfolder=C:\Users\User\Desktop\mov"
这允许在必要时轻松插入引号。它还可以防止代码中的终端空格和制表符。正如您编写的那样,任何尾随空格或制表符都将包含在分配给 rootfolder
的值中,并可能导致混乱 - 由不可见字符引起的工作时间。一次被咬,两次害羞。
clean
显然被用作布尔值。就个人而言,我建议您使用 look here 来使用布尔变量。这种用法的优点是它可以在 code blocks
(带括号的语句)中工作,而无需调用 delayedexpansion
。
echo Enumerating all MKVs under %rootfolder%
for /r %rootfolder% %%a in (*.mkv) do (
这两行中的 %rootfolder%
需要是 "quoted"
if NOT [%%s]==[0] (
嗯。记住语法 if [not] string==string
if [%%b]gtr[1] (
然后在这里申请 - 我认为您的问题是常驻的。
这是 if string (
格式,因此 cmd
应该反对,因为操作符无效 ((
)
正确的格式是
if [%%b] gtr [1] (
或者最好
if "%%b" gtr "1" (
或者可能最好
if %%b gtr 1 (
这里的问题是 gtr
(或字母比较运算符系列的任何其他成员)对任何随机字母字符串都没有意义。以 if sequins equ acceptable (
为例。 sequins
显然是 neq acceptable
,但使用您使用的语法,它应该是 if sequinsequacceptable (
应该被解释为 if s equ insequacceptable (
或 if sequins equ acceptable (
吗?
第二种形式更好。它允许比较包含空格的字符串。但是有一个问题。 if "123" gtr "2"
将被评估为 FALSE,因为比较是按字母顺序进行的; "1"
小于 "2"
所以结果是 FALSE。
因此是第三种形式,它对数字比较有效(但如果任一操作数为非数字,则将被解释为字符串形式)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。