@echo off
REM batch setlocal堆栈演示。child scope可以读取parent scope的变量,反之不行。
REM %maxlevel% 为最大嵌套层数,batch最大堆栈为32层。但是CALL可以突破此限制。
set "maxlevel=50"
set "separator= "
set "level=0"
REM 循环测试setlocal
echo,LOOP SETLOCAL TEST
:instack
2>nul,setlocal||goto outstack
set /a "level+=1"
set "indent=%indent%%separator%"
echo,%indent%InStack:Level=%level%
if %level% lss %maxlevel% goto instack
:outstack
echo,%indent%OutStack:Level=%level%
endlocal
if %level% gtr 0 goto outstack
>nul,pause
REM CALL 无参数测试setlocal
echo,CALL RECURSIVE SETLOCAL TEST
call :recurse
>nul,pause
REM CALL 有参数测试setlocal
echo,CALL RECURSIVE WITH PARAMETERS SETLOCAL TEST
call :recurseWithParameters 0 ""
>nul,pause
exit /b
:recurse
2>nul,setlocal||exit /b
set /a "level+=1"
set "indent=%indent%%separator%"
echo,%indent%InStack:Level=%level%
if %level% lss %maxlevel% call :recurse
echo,%indent%OutStack:Level=%level%
endlocal
exit /b
:recurseWithParameters
2>nul,setlocal||exit /b
set /a "level=%~1+1"
set "indent=%~2%separator%"
echo,%indent%InStack:Level=%level%
if %level% lss %maxlevel% call :recurseWithParameters %level% "%indent%"
echo,%indent%OutStack:Level=%level%
endlocal
exit /b