Board logo

标题: 关于setlocal 最大递归层 [打印本页]

作者: 220110     时间: 2006-6-17 20:40    标题: 关于setlocal 最大递归层

我尝试用三级for 循环来迭代,运行过程不断"骂":"已经达到最大的 setlocal 递归层。"这是什么意思?最大有多大?

注:---我们称编译错误或运行错误的警告为"骂".
作者: willsort     时间: 2006-6-18 18:17
Re 220110:

      最好把源码贴出来以供分析,初步猜测是将 setlocal 写在 for 内部,而没有对应的endlocal。
作者: bagpipe     时间: 2006-6-19 17:13
SETLOCAL是有递归层的限制,如果你重复启用和停用延缓环境变量的选项就会产生递归层出错的问题,具体问题还待解决!!!!!!!!!
作者: 220110     时间: 2006-6-20 13:03
说明一下,我的代码一般是这样格式:

  Quote:
@echo off
setlocal
:main
....
....
....
:endofmain
:eof
endlocal

我不把setlocal ,endlocal 写到代码里面的;也没启用什么变量延时,只是开扩展功能.
原来的问题代码已被删改过了,现在已写不回原来,所以没办法贴上来.
作者: willsort     时间: 2006-6-20 14:11
Re 220110:

      测试证明setlocal的最大递归层数为32[1]。

      事实上,我们很少需要在代码内部频繁setlocal或者开关变量延迟和命令扩展,我通常在需要变量延迟时直接使用 @echo off & setlocal EnableDelayedExpansion 。

      如果确需在for中使用setlocal,那么切记在同一层for内使用相对应的endlocal结束setlocal的影响。

      你的问题既然不是setlocal写在for中,则可能是出在多次goto到含有 setlocal 的标签段了;但既然问题无法重现,这些就只能是猜测了。
:: SetlocalMaxRecursion.cmd - Test of max recursion of setlocal
:: Will Sort - 2006-06-20 - CMD@WinXP
@echo off
for /l %%i in (1,1,100) do (
    setlocal EnableDelayedExpansion
    rem echo.%errorlevel%   
    set var=%%i
    echo counter:%%i-!var!
    if "!var:~-1!"=="0" pause
    endlocal
    rem 使用rem注释endlocal可以测得setlocal的最大递归层数为32
    rem 这里的注释标记不能使用::,否则可能会产生语法错误
    echo counter:%%i-!var!
    rem endlocal也关闭最近的setlocal所设定的变量延迟或者命令扩展
)
[ Last edited by willsort on 2006-6-20 at 14:21 ]
作者: mtiankong     时间: 2007-5-25 22:56
:: SetlocalMaxRecursion.cmd - Test of max recursion of setlocal
:: Will Sort - 2006-06-20 - CMD@WinXP
@echo off
for /l %%i in (1,1,100) do (
    setlocal EnableDelayedExpansion
    rem echo.%errorlevel%   
    set var=%%i
    echo counter:%%i-!var!
    if "!var:~-1!"=="0" pause
    endlocal
    rem 使用rem注释endlocal可以测得setlocal的最大递归层数为32
    rem 这里的注释标记不能使用::,否则可能会产生语法错误
    echo counter:%%i-!var!
    rem endlocal也关闭最近的setlocal所设定的变量延迟或者命令扩展
)

我在XP下测试  一直到100 不明白。。。