请帮忙。 我在 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^=
定义了一个空的字符串分隔符列表,并且没有定义行结束符,以真正获取分配给指定循环变量 I
的 FOR 捕获的整行。 。此处通过未包含在 "
中的异常指定这两个选项。否则无法定义空的分隔符列表并且没有行结束符。两个等号和空格必须使用脱字符号 ^
进行转义由于未包含在双引号参数字符串中,因此被解释为文字字符而不是参数字符串分隔符。
为了了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
-
cmd /?
...解释了选项/C
之后的字符串中如何使用双引号或/K
由 Windows 命令处理器解释,并且文件名(或任何其他参数字符串)必须包含在"
中包含空格或这些字符之一&()[]{}^=;!'+,`~<|>
. -
for /?
-
if /?
-
set /?
另请参阅有关 Using command redirection operators 的 Microsoft 文章.
关于batch-file - 将 ffmpeg 输出解析为批处理变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57736580/