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
关键修复点
- 启用延迟变量扩展:添加
setlocal enabledelayedexpansion,确保!变量!格式的延迟变量能正确解析。 - 封装内部循环逻辑:将原主循环内的
:NextToken跳转逻辑移到独立的ProcessBaseName子函数中,内部的goto InnerNextToken仅在子函数内跳转,不会破坏外部for %%f的循环迭代流程。 - 参数化子函数:
ProcessBaseName接收文件名作为参数,处理完成后返回主循环,保证每个.cpp文件都能被完整处理。
内容的提问来源于stack exchange,提问作者Zhukov Artem
相关产品推荐
相关产品推荐

