我希望将视频编解码器存储为批处理文件中的变量,以自动执行某些视频转换,但又不想转换已经是正确编解码器的内容。
这会成功地生成编解码器(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'已经指定了。"
我真的不知道该去哪里,因为我的所有阅读都表明这是存储变量的正确方法。
答案 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。