批量存储 ffprobe 作为变量

batch store ffprobe as variable

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

这成功生成了编解码器 (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

但是我一直无法将结果存储在变量中,我遵循了一些 建议这种布局。

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%

但是这会导致此错误:"Argument 'noprint_wrappers' provided as input filename, but 'codec_name' was already specified."

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

已经向您展示了您错过的内容,并明确指示您转义 ^= 等号,所以您为什么不这样做呢?

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%

问题是=,除了SPACETAB, , ; 和不间断的 space, 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 被扩展 命令行被解析后,所以像令牌分隔符这样的特殊字符在那一刻不再被识别。

请注意 codec 的值在 endlocal 之后不再可用,除非您建立 suitable countermeasures