用于处理控制台应用程序输出的命令是
FOR。
可以使用类似下面的批处理文件代码来捕获
ffprobe的输出并将其赋值给环境变量。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
if not exist input.mp4 goto :EOF
for /F "delims=" %%I in ('ffprobe.exe -v error -show_entries format^=duration -of default^=noprint_wrappers^=1:nokey^=1 input.mp4 2^>^&1') do set "duration=%%I"
echo Duration is: %duration%
endlocal
命令
FOR选项
/F
解释被包含在
'
中的字符串作为要执行的命令,其输出写入
STDOUT应逐行处理。为此,
FOR和
cmd.exe
会在后台启动一个额外的命令进程,使用
%ComSpec% /c
和位于
'
之间的命令行作为附加参数,并捕获所有写入到额外启动的后台命令进程的
STDOUT句柄的内容。
Windows命令处理器
cmd.exe
处理批处理文件时,空格、逗号
,
、分号
;
、等号
=
和OEM编码的不换行空格
(十进制代码值为255)都被视为参数分隔符。因此,在传递给在后台启动的
cmd.exe
的命令行中,需要使用
^
转义每个
=
,以便让
cmd.exe
处理批处理文件的等号被解释为字面字符而不是参数分隔符。
2>&1
将输出写入到 STDERR(标准错误)的内容重定向到处理 STDOUT(标准输出)的句柄,由 FOR 处理。在这里,需要使用 ^
对运行 ffprobe 时的操作符 >
和 &
进行转义,以便将此重定向应用于解析 FOR 命令行时而不是已经解释的重定向。请参阅 Microsoft 文章 Using command redirection operators。如果 ffprobe 在正确使用时将所请求的信息输出到 STDOUT,则此将 STDERR 重定向到 STDOUT 可能是不必要的。但如果 ffprobe 将数据输出到 STDERR,那么这可能很重要。
因此,在安装了 Windows 的 C:\Windows
中后台执行以下操作:
C:\Windows\System32\cmd.exe /c ffprobe.exe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4 2>&1
这是根据运行Windows 命令提示符窗口中的cmd /?
输出所解释的语法,对Windows命令处理器的绝对有效执行。
/F
后面用双引号括起来的选项delims=
禁止将捕获的行分割为多个标记(字符串),使用空格和水平制表符作为字符串分隔符,因为它定义了一个空的字符串分隔符列表。"delims="
可能对使用的命令行的ffprobe输出不是必需的。但是我没有安装ffprobe,并且在问题中没有发布它的输出。
要理解所用命令及其工作原理,请打开一个命令提示符窗口,在其中执行以下命令,并完整和仔细地阅读每个命令显示的帮助页面。
回显 /?
结束本地环境 /?
循环 /?
跳转 /?
条件语句 /?
设置变量 /?
启用本地环境 /?
FOR /F
循环命令:针对另一个命令的结果。 - JosefZ