Windows Batch嵌套循环与变量问题:媒体类型识别脚本故障
问题分析与修复方案
核心问题汇总
你的Batch脚本出现识别颠倒和Missing operator错误,根源在于以下几个关键问题:
- 变量名拼写混乱,导致权重累加失效
- 关键词与权重的匹配逻辑完全颠倒
errorlevel判断逻辑错误,导致无差别累加权重- 分号分隔的关键词列表无法被正确遍历
- 延迟扩展使用不规范,变量值无法实时更新
修复后的完整代码
:DETERMINE setlocal EnableDelayedExpansion REM DT NAME set "DTNM=%~1" echo !DTNM! REM DT Location set "DLOC=%~2" REM DT Movie Weight set /A DTMV=0 REM DT TV Weight set /A DTTV=0 REM DT TV Keywords (格式: 关键词,权重;...) set "DTTR=Season,90;Volume,70;TV,45;S1,100;V1,75;" REM DT Movie Keywords set "DMVT=!DTNM!,45;Theatrical,90;Extended,60;Unrated,60;Extra,5;Bonus,10;Bonus-Content,15;Bonus-Disc,12;Bonus-Disk,12;Bonus_Content,15;Bonus_Disc,12;Bonus_Disk,12;Bonus Content,15;Bonus Disc,12;Bonus Disk,12;Special,2;Special-Features,18;Special-Content,15;Special_Features,18;Special_Content,15;Special Features,18;Special Content,15;" REM 计算电影权重DTMV for /f "tokens=*" %%U in ('dir /b /ad "!DLOC!"') do ( REM 拆分电影关键词列表 set "temp=!DMVT!" :loop_movie if not "!temp!"=="" ( for /f "tokens=1* delims=;" %%a in ("!temp!") do ( if not "%%a"=="" ( REM 拆分关键词和权重 for /f "tokens=1-2 delims=," %%k in ("%%a") do ( echo %%U|find /I "%%k" >nul if not errorlevel 1 ( set /A DTMV+=%%l ) ) ) set "temp=%%b" goto loop_movie ) ) ) REM 计算剧集权重DTTV for /f "tokens=*" %%T in ('dir /b /ad "!DLOC!"') do ( REM 拆分剧集关键词列表 set "temp=!DTTR!" :loop_tv if not "!temp!"=="" ( for /f "tokens=1* delims=;" %%a in ("!temp!") do ( if not "%%a"=="" ( REM 拆分关键词和权重 for /f "tokens=1-2 delims=," %%k in ("%%a") do ( echo %%T|find /I "%%k" >nul if not errorlevel 1 ( set /A DTTV+=%%l ) ) ) set "temp=%%b" goto loop_tv ) ) ) echo 电影权重: !DTMV! 剧集权重: !DTTV! set /A DEQ=!DTMV! - !DTTV! echo 差值评分: !DEQ! ENDLOCAL GOTO:EOF
关键修改说明
修正变量名错误
统一使用DTMV表示电影权重,避免原脚本中DTMV与DMTV的拼写混乱,确保权重累加正确。修复匹配逻辑
将原脚本中颠倒的关键词/权重变量替换:用%%k(关键词)匹配文件夹名,%%l(权重)进行累加,彻底解决识别颠倒问题。修正
errorlevel判断
原脚本if errorlevel 0会始终为真(Batch中errorlevel最小值为0),改为if not errorlevel 1,仅在find命令匹配成功时累加权重。正确遍历关键词列表
通过临时变量+goto循环的方式,逐个拆分分号分隔的关键词-权重对,确保遍历所有条目(原for /f写法仅能提取第一个元素)。规范延迟扩展使用
所有循环内的变量引用和输出均使用!变量!,保证获取实时更新的变量值,避免解析时的初始值覆盖问题。移除冗余代码
删除无意义的set DMTV=!DMTV!类“逃逸 workaround”代码,简化脚本结构。
内容的提问来源于stack exchange,提问作者aleczdr
相关产品推荐
相关产品推荐

