中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 关于setlocal 最大递归层 上一主题 | 下一主题
220110
荣誉版主




积分 718
发帖 313
注册 2005-9-26
状态 离线
『楼 主』:  关于setlocal 最大递归层

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

注:---我们称编译错误或运行错误的警告为"骂".

2006-6-17 20:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 2 楼』:  

Re 220110:

      最好把源码贴出来以供分析,初步猜测是将 setlocal 写在 for 内部,而没有对应的endlocal。



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-18 18:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bagpipe
银牌会员

DOS联盟捡破烂的


积分 1144
发帖 425
注册 2005-10-20
来自 北京
状态 离线
『第 3 楼』:  

SETLOCAL是有递归层的限制,如果你重复启用和停用延缓环境变量的选项就会产生递归层出错的问题,具体问题还待解决!!!!!!!!!

2006-6-19 17:13
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
220110
荣誉版主




积分 718
发帖 313
注册 2005-9-26
状态 离线
『第 4 楼』:  

说明一下,我的代码一般是这样格式:

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

我不把setlocal ,endlocal 写到代码里面的;也没启用什么变量延时,只是开扩展功能.
原来的问题代码已被删改过了,现在已写不回原来,所以没办法贴上来.

2006-6-20 13:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 5 楼』:  

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 ]

   此帖被 +8 点积分        点击查看详情   
评分人:【 everest79 分数: +8  时间:2007-3-29 21:07




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-20 14:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
mtiankong
初级用户





积分 70
发帖 38
注册 2007-3-24
状态 离线
『第 6 楼』:  

:: 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 不明白。。。

2007-5-25 22:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: