设计用于处理控制台应用程序输出的命令是FOR https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/for.
像下面这样的批处理文件代码可用于捕获输出ffprobe https://ffmpeg.org/ffprobe.html并将其分配给环境变量。
@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)作为参数分隔符。因此,有必要逃避每一个=
with ^
在命令行中传递给cmd.exe
在后台开始将等号解释为文字字符cmd.exe
处理批处理文件而不是参数分隔符。
2>&1
将输出重定向到STDERR(标准错误)处理STDOUT(标准输出)由FOR。这里有必要逃避操作员>
and &
with ^
在执行时应用此重定向ffprobe并且不解释已经解析的重定向FOR命令行。请参阅微软文章使用命令重定向运算符 https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-xp/bb490982(v=technet.10)。这个重定向STDERR to STDOUT也许没有必要,如果ffprobe正确使用时输出所请求的信息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 中命令提示符 https://www.howtogeek.com/235101/10-ways-to-open-the-command-prompt-in-windows-10/ window.
选项delims=
之后用双引号括起来/F
禁用使用空格和水平制表符作为字符串分隔符将捕获的行拆分为多个标记(字符串),因为它定义了一个空的字符串分隔符列表。"delims="
很可能不需要输出ffprobe使用使用的命令行。但我没有ffprobe安装了并且没有发布问题它的输出。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
echo /?
endlocal /?
for /?
goto /?
if /?
set /?
setlocal /?