批量存储ffprobe作为变量

时间:2017-06-12 05:54:10

标签: batch-file cmd ffprobe

我希望将视频编解码器存储为批处理文件中的变量,以自动执行某些视频转换,但又不想转换已经是正确编解码器的内容。

这会成功地生成编解码器(hevc)

C:\ffmpeg\bin\ffprobe.exe -v error -select_streams v:0 -show_entries` stream=codec_name -of default=noprint_wrappers=1:nokey=1 video.mkv
pause

但是我无法将结果存储在变量中,我已经跟随了一些建议此布局的examples

for /F "delims=" %%I in ('C:\ffmpeg\bin\ffprobe.exe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 video.mkv') do set "codec=%%I"
echo %codec%

然而,这会导致此错误:"参数' noprint_wrappers'提供为输入文件名,但' codec_name'已经指定了。"

我真的不知道该去哪里,因为我的所有阅读都表明这是存储变量的正确方法。

1 个答案:

答案 0 :(得分:4)

solution to the example question you linked已经向您展示了您错过的内容并明确指示您逃避^=之类的等号,那么为什么不这样做呢?

for /F "delims=" %%I in ('C:\ffmpeg\bin\ffprobe.exe -v error -select_streams v:0 -show_entries stream^=codec_name -of default^=noprint_wrappers^=1:nokey^=1 video.mkv') do set "codec=%%I"
echo(%codec%

问题在于=,除了 SPACE TAB ,;和非休息空间,ASCII 0xFF构成命令解释器的标记分隔符,因此在解析命令行时它会丢失(或由 SPACE 替换)。逃避规定了特殊的意义并从字面上保留了字符。

作为转义的替代方法,可以使用delayed expansion,如下所示:

set "CommandLine=C:\ffmpeg\bin\ffprobe.exe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 video.mkv"
setlocal EnableDelayedExpansion
for /F "delims=" %%I in ('!CommandLine!') do set "codec=%%I"
echo(%codec%
endlocal

这样可行,因为命令行字符串在分配语句(set)中显示,因此无法识别任何标记分隔符和其他特殊字符,并且扩展变量CommandLine 在解析了命令行之后,此时不再识别像标记分隔符这样的特殊字符。

除非您确定suitable countermeasures,否则codec的价值不再可用,除非您确定https://domain