将 ffprobe 批量存储为变量

Rya*_*321 2 cmd batch-file 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
Run Code Online (Sandbox Code Playgroud)

但是我一直无法将该结果存储在变量中,我已经遵循了许多建议这种布局的示例

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%
Run Code Online (Sandbox Code Playgroud)

但是这会导致此错误:“参数 'noprint_wrappers' 作为输入文件名提供,但 'codec_name' 已指定。”

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

asc*_*pfl 5

您链接的示例问题解决方案已经向您展示了您错过了什么,并明确指示您避开等号,如^=,那么您为什么不这样做呢?

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%
Run Code Online (Sandbox Code Playgroud)

的问题是,=除了SPACETAB,;和非休息空间,ASCII 0xFF,构成了令牌分离器以命令解释程序,所以它丢失(或由取代SPACE),当在解析命令行。转义取消了特殊含义并按字面​​保留了字符。

作为转义的替代方法,可以使用延迟扩展,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为命令行字符串出现在赋值语句 ( set) 中,因此不会识别任何标记分隔符和其他特殊字符,并且在解析命令行CommandLine扩展变量,因此不会识别标记分隔符等特殊字符在那一刻不再认出。

除非您制定了合适的对策,否则该值将codec不再可用。endlocal