批量获取MediaInfo视频高度:已定义变量时返回错误结果(%%转义问题)
批处理调用MediaInfo避免变量冲突的解决方案
原脚本(存在变量冲突问题):
@echo off setlocal enableextensions enabledelayedexpansion REM set "HEIGHT=1081" for /f "tokens=* delims=" %%j in (' "mediainfo --Inform=Video;%%Height%% "b:\VID\myVideo.avi"" ') do set "HEI=%%j" echo=!HEI!
当启用set "HEIGHT=1081"后,脚本会返回1081而非视频实际高度——原因是批处理会把%%Height%%中的%Height%解析为已定义的环境变量,而非传给MediaInfo的占位符。以下是两种无需清空变量的修复方法:
方法一:多层转义占位符
调整for循环内的MediaInfo命令,通过多层转义确保%Height%原样传给MediaInfo:
@echo off setlocal enableextensions enabledelayedexpansion set "HEIGHT=1081" for /f "tokens=* delims=" %%j in (' mediainfo --Inform=Video;^^%%Height^^%% "b:\VID\myVideo.avi" ') do set "HEI=%%j" echo=!HEI!
原理:在for的单引号命令环境中,^^会被解析为单个^,^%%会被解析为单个%,最终传给MediaInfo的参数是Video;%Height%,同时避免了当前环境的HEIGHT变量替换。
方法二:临时关闭延迟扩展执行命令
通过启动新的cmd实例并关闭延迟扩展,确保占位符不被解析:
@echo off setlocal enableextensions enabledelayedexpansion set "HEIGHT=1081" for /f "tokens=* delims=" %%j in (' cmd /v:off /c "mediainfo --Inform=Video;%%Height%% "b:\VID\myVideo.avi"" ') do set "HEI=%%j" echo=!HEI!
原理:cmd /v:off会创建一个关闭延迟扩展的子进程,在这个进程中%%Height%%不会被当前环境的变量替换,而是直接传递给MediaInfo作为格式占位符。
内容的提问来源于stack exchange,提问作者isidroco
相关产品推荐
相关产品推荐

