Batch file 批存储ffprobe作为变量

Batch file 批存储ffprobe作为变量,batch-file,cmd,ffprobe,Batch File,Cmd,Ffprobe,我希望将视频编解码器作为一个变量存储在批处理文件中,以自动化一些视频转换,但不希望转换已经是正确编解码器的内容 这将成功生成一个编解码器(hevc) 然而,我无法将结果存储在变量中,我遵循了许多建议这种布局的方法 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

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

这将成功生成一个编解码器(hevc)

然而,我无法将结果存储在变量中,我遵循了许多建议这种布局的方法

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’。”

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

已经向您显示了您遗漏的内容,并明确指示您避开等号,如
^=
,那么您为什么不这样做呢

for/F“delims=“%%I in('C:\ffmpeg\bin\ffprobe.exe-v error-select\u streams v:0-show\u entries stream^=codec\u name-of default^=noprint\u wrappers^=1:nokey^=1 video.mkv')设置“codec=%I”
回声(%codec%)
问题在于,
=
除了空格、制表符、
和非中断空格ASCII
0xFF
之外,还构成了命令解释器的标记分隔符,因此它丢失(或被空格替换)解析命令行时。转义将取消特殊含义并按字面保留字符

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

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
对于/F“delims=”(“!CommandLine!”)中的%%I,请设置“codec=%%I”
回声(%codec%)
端部
这是可行的,因为命令行字符串在赋值语句(
set
)中被引用,因此任何标记分隔符和其他特殊字符都无法识别,并且变量
CommandLine
在解析命令行后会展开,因此此时无法识别像标记分隔符这样的特殊字符


考虑到
codec
的值在
endlocal
之外不再可用,除非您在
'
(单引号)中建立。

,用插入符号(
^
)转义每个
=
)因此:
…ult^=noprint_wrappers^=1:nokey^=1 vi.
通知
=
是文本的。您确定延迟扩展变量
echo(%codec%
)中的输出行是否应该是
echo(!codec!)
?@PeterCo启用延迟扩展后,不允许使用正常扩展(立即)
%
-扩展;但是,是的,
!codec!
通常会更好,因为当扩展字符串本身包含感叹号
时,
%codec%
可能会导致问题,而感叹号会被延迟扩展所消耗…
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%