微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Remux MKV 在批处理文件中使用 mkvmerge 删除字幕和不需要的音轨

如何解决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 举报,一经查实,本站将立刻删除。