batch-file - 将 ffmpeg 输出解析为批处理变量

标签 batch-file ffmpeg

请帮忙。 我在 Windows 命令行上,我希望 ffmpeg 错误作为变量返回。 尝试了很多方法,还是不行。

@echo off&setlocal disabledelayedexpansion
SET S="path\to\ffmpeg.exe" -hide_banner -i InputFile.FLV -vframes 1 -an -s 400x222 -ss 30 OutputFile.jpg
!S!
for /f "usebackq delims=" %%A in ('!S!') do set var=%%A
echo !var!

结果是语句 !S!在控制台上生成正确的输出(InputFile.FLV:没有此类文件或目录),但不会将其放入变量中。 echo !var! 的输出语句简单地显示为 "path\to\ffmpeg.exe"-hide_banner -i InputFile.FLV -vframes 1 -an -s 400x222 -ss 30 OutputFile.jpg

如何获得 !S! 的输出进入!var!?

最佳答案

命令setlocal disabledelayedexpansion显式禁用延迟扩展,因此 !S!根本没有延迟扩展。因此,命令行只需 !S!导致执行批处理文件时出现错误消息,并且绝对不会出现在输出中 InputFile.FLV: No such file or directory 。最后一行仅输出字符串 !var! .

for的用法选项usebackq结果解释 ' 之间的字符串... '作为字符串,而不是作为使用 %ComSpec% /c 执行的命令行在后台命令进程中。因此字符串 !S!被分配给变量var .

因此可以预期批处理文件是用setlocal EnableDelayedExpansion执行的。实际上以获得问题中所写的输出。

这个未经测试的批处理文件应该适用于此任务。

@echo off
set "var="
for /F delims^=^ eol^= %%I in ('""path\to\ffmpeg.exe" -hide_banner -i InputFile.FLV -vframes 1 -an -s 400x222 -ss 30 OutputFile.jpg 2>&1"') do set "var=%%I"
if defined var set var

带选项的命令FOR /F不使用选项 usebackq并在两者之间定义命令行 '在后台执行%ComSpec% /c以及两者之间的字符串 '附加。因此,在 C:\Windows 安装 Windows 的情况下执行是:

C:\Windows\System32\cmd.exe /c ""path\to\ffmpeg.exe" -hide_banner -i InputFile.FLV -vframes 1 -an -s 400x222 -ss 30 OutputFile.jpg 2>&1"

在这种情况下,在后台运行的已启动 Windows 命令处理器实例会删除第一个和最后一个 "在执行剩余的命令行之前:

"path\to\ffmpeg.exe" -hide_banner -i InputFile.FLV -vframes 1 -an -s 400x222 -ss 30 OutputFile.jpg 2>&1

ffmpeg.exe据我所知,我根本没有安装这样的输出信息来处理 STDERR (标准错误)而不是 STDOUT (标准输出)。但是 FOR 仅捕获为处理已启动命令进程的 STDOUT 写入的输出。因此2>&1需要重定向为处理后台命令进程的STDERR而编写的输出 ffmpeg.exe处理后台命令进程的STDOUT,以便也由正在处理批处理文件的命令进程的FOR捕获。

使用 FOR 选项参数字符串 delims^=^ eol^=定义了一个空的字符串分隔符列表,并且没有定义行结束符,以真正获取分配给指定循环变量 IFOR 捕获的整行。 。此处通过未包含在 " 中的异常指定这两个选项。否则无法定义空的分隔符列表并且没有行结束符。两个等号和空格必须使用脱字符号 ^ 进行转义由于未包含在双引号参数字符串中,因此被解释为文字字符而不是参数字符串分隔符。

为了了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • cmd /? ...解释了选项 /C 之后的字符串中如何使用双引号或/K由 Windows 命令处理器解释,并且文件名(或任何其他参数字符串)必须包含在 " 中包含空格或这些字符之一 &()[]{}^=;!'+,`~<|> .
  • for /?
  • if /?
  • set /?

另请参阅有关 Using command redirection operators 的 Microsoft 文章.

关于batch-file - 将 ffmpeg 输出解析为批处理变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57736580/

相关文章:

android - 在 Windows 上使用 NDK r10 为 android 编译 ffmpeg 2.3

node.js - Node JS,检测生产环境

linux - 从批处理转换为 shell

Windows批处理文件在硬盘中查找重复大小的文件(无论名称和扩展名)

batch-file - 如何使用 wmic 获取特定进程的进程 ID 并检查错误?

java - 将视频转换为 GIF

batch-file - 使用 cmd 命令中的变量

ubuntu - 我想在 ubuntu 上合并 mp3 文件

video - MPEG-DASH 流中的不同视频时长

python - 如何修复 CalledProcessError : in ffmpeg