在另一个命令中使用 mediainfo 的输出作为变量

Posted

技术标签:

【中文标题】在另一个命令中使用 mediainfo 的输出作为变量【英文标题】:using output from mediainfo as variable in another command 【发布时间】:2017-02-15 11:00:43 【问题描述】:

所以我正在尝试设置一种简单的方法来使用 bat 文件启动视频,并首先运行 Mediainfo 以获取视频的长度,以便它可以在播放完成后停止 vlc 或其他任何内容。

Complete name                            : C:\Users\Tyler\Desktop\Psych s05e11.mp4
Format                                   : MPEG-4
Format profile                           : Base Media
Codec ID                                 : isom (isom/iso2/avc1/mp41)
File size                                : 116 MiB
Duration                                 : 42 min 36 s
Overall bit rate                         : 382 kb/s
Writing application                      : Lavf55.13.102

这是我在 txt 文件中获得的 mediainfo 的输出,我试图从持续时间位中提取 42 和 36 并在另一个命令中使用它。我还应该补充一点,这些数字必须单独使用。谢谢!

编辑:感谢回复大家喜欢的帮助; 这是我现在要运行的内容:

mediainfo.lnk --Language=raw --Output=General;%Duration% "C:\Users\Tyler\Desktop\Psych s05e11.mp4"

输出是:

2556249

现在我需要一种方法来获取前四位数字并在另一个命令中使用它们,以某种方式将 2556 设为变量?

【问题讨论】:

您可以发布您尝试过的内容吗?你可以使用 FOR /F 和 FIND 来解决这个问题。 在我们提供解决方案之前,您需要了解一下您是如何执行 mediainfo 的。 【参考方案1】:

如果您需要持续时间,请使用例如这个命令:

mediainfo "--Output=General;%Duration%" YourFileName.ext

一般来说,当你想到一些自动化时,更喜欢使用例如:

mediainfo -f --Language=raw  YourFileName.ext

并选择更符合您需要的行,避免使用“/String”的字段,因为它们仅用于显示(而不是用于自动化)。

Jérôme,MediaInfo 的开发人员。

【讨论】:

我正在运行这样的命令:mediainfo --Language=raw --Output=General;%Duration% "filename.ext" >> "outputfile.txt" 我只得到我想要的持续时间,谢谢你的帮助! 这是我遇到的一个奇怪问题;当我像在最后一条评论中显示的那样从终端运行命令时,我得到了正确的输出,但是在批处理文件中使用完全相同的命令返回没有任何选项的输出,它运行为: mediainfo --Output=文件:\\file.txt“文件名.ext”。提供太多信息!我能做些什么来解决这个问题? 只是告诉你(作为开发者)你不应该在 CLI 版本的软件中使用 % 作为 var 定义器。最好使用另一个字符,例如$。反正很软!! 不是 MediaInfo 的问题,这是您的批处理中的问题:% 用于变量,您忘记对其进行转义。 mediainfo "--Output=General;%%Duration%%" %1 你说得对,我忘记了“字符串”,修改了我的答案,谢谢【参考方案2】:

好的,这就是我最后所做的,感谢所有帮助!

C:\mediainfo\MediaInfo.exe --Language=raw --Output=General;%%Duration%% "C:\Users\Tyler\Desktop\Psych_s05e11.mp4" >out.txt  
set /p $Duration= <out.txt
set $Duration=%$Duration:~0,4%

echo Result = %$Duration%
del out.txt
pause

输出是:

C:\mediainfo\MediaInfo.exe --Language=raw --Output=General;%Duration%    "C:\Users\Tyler\Desktop\Psych_s05e11.mp4" >out.txt 
set /p $Duration=  <out.txt 
set $Duration=2556 
echo Result = 2556 
Result = 2556
del out.txt 
pause
Press any key to continue . . . 

把@echo 从那里拿走,这样你就可以看到它了

【讨论】:

【参考方案3】:

使用FOR /F

@echo off
for /f "delims=" %%a in ('mediainfo "--Output=General;%%Duration%%" "C:\Users\Tyler\Desktop\Psych\s05e11.mp4"') do set $Duration=%%a

Echo %$Duration%

使用临时文件

@echo off
mediainfo.exe --Language=raw --Output=General;%%Duration%% "C:\Users\Tyler\Desktop\Psych s05e11.mp4" >out.txt  
set /p $Duration= <out.txt
set $Duration=%$Duration:~0,4%

echo Result = %$Duration%
del out.txt

使用@Jérôme Martinez [raw -output] 想法的另一种方式。 没有临时文件,使用findstr

@echo off
for /f "tokens=2 delims=:" %%a in ('mediainfo -f --Language=raw  "C:\Users\Tyler\Desktop\Psych s05e11.mp4" ^| findstr /i "duration"') do (
    set $Duration=%%a
    goto:next
)

:next
set $Duration=%$Duration:~1,4%
echo %$Duration%

【讨论】:

感谢您的帮助;似乎比我到目前为止的任何东西都近!但是回显输出是:Result = ~0,4 发现路径设置错误,现在找到了输出是:Result = Alte 好的,当您执行mediainfo.lnk --Language=raw --Output=General;^%Duration^% "C:\Users\Tyler\Desktop\Psych s05e11.mp4" 时,确切的输出是什么?在所有情况下,您最好直接在 .exe 上工作,而不是在 .lnk 如果我在终端中运行它,我会得到预期的 2556249,但如果我在 bat 文件中运行它,输出是 mediainfo 默认显示的大量内容,我将尝试使用exe文件代替 我使用 exe 文件而不是链接再次运行它,同样的输出,一长串我不需要的东西。但是,如果我自己执行该命令,它只会打印出 Duration

以上是关于在另一个命令中使用 mediainfo 的输出作为变量的主要内容,如果未能解决你的问题,请参考以下文章

使用 MediaInfo 命令行和 jq 从文件目录构建有效的 JSON 播放列表

Python 2.7 mediainfo --inform 输出完整信息而不是一个字符串

在 python 中使用 mediainfo 提取电影名称

Bash:无法通过 mediainfo 浏览目录中的所有文件

将 MediaInfo DLL 与 C# DLLImport 一起使用

具有立体声或多个音频流的媒体流的音频持续时间的特定 mediainfo 命令