用于处理控制台应用程序输出的命令是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
带有选项/F 的命令FOR 将' 中包含的字符串解释为要执行的命令,写入STDOUT 的输出应逐行处理。 FOR 分别为cmd.exe 处理批处理文件为此在后台启动另一个命令进程,其中%ComSpec% /c 和' 之间的命令行作为附加参数附加,并捕获所有写入处理STDOUT额外启动的后台命令进程。
Windows 命令处理器cmd.exe 处理批处理文件在空格之间也解释为逗号,、分号;、等号= 和OEM 编码的不间断空格 (带有十进制代码值255)为参数分隔符。出于这个原因,有必要在命令行中使用^ 转义每个= 以传递给在后台启动的cmd.exe,以便通过cmd.exe 处理批处理文件而不是参数分隔符将等号解释为文字字符.
2>&1 将写入 STDERR(标准错误)的输出重定向到处理由 FOR 处理的 STDOUT(标准输出)。这里有必要使用 ^ 转义运算符 > 和 & 以在执行 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 command prompt 窗口中运行 cmd /? 的帮助输出所解释的语法,这是绝对有效的 Windows 命令处理器执行。
/F 之后的双引号中的选项delims= 禁止使用空格和水平制表符作为字符串分隔符将捕获的行拆分为多个标记(字符串),因为它定义了一个空的字符串分隔符列表。 "delims=" 很可能对于使用命令行输出 ffprobe 是不必要的。但是我没有安装 ffprobe 并且没有发布它输出的问题。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
echo /?
endlocal /?
for /?
goto /?
if /?
set /?
setlocal /?