You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键修改说明

  1. 修正变量名错误
    统一使用DTMV表示电影权重,避免原脚本中DTMV与DMTV的拼写混乱,确保权重累加正确。

  2. 修复匹配逻辑
    将原脚本中颠倒的关键词/权重变量替换:用%%k(关键词)匹配文件夹名,%%l(权重)进行累加,彻底解决识别颠倒问题。

  3. 修正errorlevel判断
    原脚本if errorlevel 0会始终为真(Batch中errorlevel最小值为0),改为if not errorlevel 1,仅在find命令匹配成功时累加权重。

  4. 正确遍历关键词列表
    通过临时变量+goto循环的方式,逐个拆分分号分隔的关键词-权重对,确保遍历所有条目(原for /f写法仅能提取第一个元素)。

  5. 规范延迟扩展使用
    所有循环内的变量引用和输出均使用!变量!,保证获取实时更新的变量值,避免解析时的初始值覆盖问题。

  6. 移除冗余代码
    删除无意义的set DMTV=!DMTV!类“逃逸 workaround”代码,简化脚本结构。


内容的提问来源于stack exchange,提问作者aleczdr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:19:54