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

Windows批处理脚本调用函数后For循环仅执行一次问题

Windows批处理For循环仅执行一次的问题修复

问题根源

你的代码在for %%f的循环块内部定义了:NextToken标签,并使用goto NextToken跳转。批处理的标签是全局作用域,第一次循环执行完内部goto逻辑后,后续循环迭代时,解释器会直接跳转到该标签位置,而非继续执行循环的下一次迭代,最终导致循环仅执行一次。此外,原代码缺少延迟变量扩展的启用声明,可能引发变量解析错误。

修复后的完整代码

@echo off
setlocal enabledelayedexpansion

pushd ..\build\scenes\
del *.pdb > NUL 2> NUL
for %%f in ("..\..\src\game_scenes\*.cpp") do (
    set "FileName=%%f"
    set "BaseName=%%~nf"
    set "ExportName="
    
    ; 调用子函数处理文件名的下划线拆分与首字母大写
    call :ProcessBaseName "!BaseName!"
    
    set ExportName=!ExportName!Create
    ; 可在此添加ExportName的业务逻辑,例如输出或写入文件
    ; echo !ExportName!
)
popd

endlocal
goto :eof

:ProcessBaseName
    set "CurrentName=%~1"
    :InnerNextToken
    if not "!CurrentName!"=="" (
        for /F "tokens=1,* delims=_" %%a in ("!CurrentName!") do (
            call :ProcessToken %%a
            set "CurrentName=%%b"
        )
        goto InnerNextToken
    )
    goto :eof

:ProcessToken
    call :CapitalizeFirstLetter %1
    set "ExportName=!ExportName!!CapWord!"
    goto :eof

:CapitalizeFirstLetter
    set InputWord=%1
    set FirstChar=%InputWord:~0,1%
    set RemainingChars=%InputWord:~1%
    for %%i in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
        if /i "!FirstChar!"=="%%i" set FirstChar=%%i
    )
    set CapWord=!FirstChar!!RemainingChars!
    goto :eof

关键修复点

  1. 启用延迟变量扩展:添加setlocal enabledelayedexpansion,确保!变量!格式的延迟变量能正确解析。
  2. 封装内部循环逻辑:将原主循环内的:NextToken跳转逻辑移到独立的ProcessBaseName子函数中,内部的goto InnerNextToken仅在子函数内跳转,不会破坏外部for %%f的循环迭代流程。
  3. 参数化子函数:ProcessBaseName接收文件名作为参数,处理完成后返回主循环,保证每个.cpp文件都能被完整处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 23:05:11