中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-14 18:56
楼 主 关于setlocal 最大递归层 发表于 2006-06-17 20:40 ·  中国 广东 广州 电信
荣誉版主
★★★
积分 718
发帖 313
注册 2005-09-26 00:00
UID 42844
性别 男
状态 离线
我尝试用三级for 循环来迭代,运行过程不断"骂":"已经达到最大的 setlocal 递归层。"这是什么意思?最大有多大?

注:---我们称编译错误或运行错误的警告为"骂".
2 发表于 2006-06-18 18:17 ·  中国 山西 运城 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线
Re 220110:

最好把源码贴出来以供分析,初步猜测是将 setlocal 写在 for 内部,而没有对应的endlocal。
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
3 发表于 2006-06-19 17:13 ·  中国 北京 联通
银牌会员
★★★
DOS联盟捡破烂的
积分 1,144
发帖 425
注册 2005-10-20 00:00
UID 43784
来自 北京
状态 离线
SETLOCAL是有递归层的限制,如果你重复启用和停用延缓环境变量的选项就会产生递归层出错的问题,具体问题还待解决!!!!!!!!!
4 发表于 2006-06-20 13:03 ·  中国 广东 广州 越秀区 电信
荣誉版主
★★★
积分 718
发帖 313
注册 2005-09-26 00:00
UID 42844
性别 男
状态 离线
说明一下,我的代码一般是这样格式:

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


我不把setlocal ,endlocal 写到代码里面的;也没启用什么变量延时,只是开扩展功能.
原来的问题代码已被删改过了,现在已写不回原来,所以没办法贴上来.
5 发表于 2006-06-20 14:11 ·  中国 山西 大同 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线
Re 220110:

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

事实上,我们很少需要在代码内部频繁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 ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
everest79 +8 2007-03-29 21:07
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
6 发表于 2007-05-25 22:56 ·  中国 辽宁 大连 联通
初级用户
积分 70
发帖 38
注册 2007-03-24 09:25
UID 82762
性别 男
状态 离线
:: 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 不明白。。。
论坛跳转: