批量存储 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%
问题是=
,除了SPACE,TAB,,
, ;
和不间断的 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。
我希望将视频编解码器作为变量存储在批处理文件中以自动进行一些视频转换,但不想转换已经是正确编解码器的内容。
这成功生成了编解码器 (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%
问题是=
,除了SPACE,TAB,,
, ;
和不间断的 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。