[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
原帖由 greenworld 于 2010-12-28 10:45 发表
所以大概的结论是,call 会让 SetLocal EnableDelayedExpansion 开辟新的变量空间,此时对环境变量来说,相当于SetLocal...而SetLocal DisableDelayedExpansion则相当于endlocal

enabledelayedexpansion  、 disabledelayedexpansion 参数没有关系。
1,不要频繁使用setlocal,如果不及时Endlocal会造成超过最大允许递归层(xp下是32)
2,每次setlocal本地化时就开启了一个新的(子层)变量空间,并且保存新的变量变化,命令对变量的读写也在当前层(可从父层继承)。
而call返回后对变量的读写则回到了原来(父层)的变量空间。
最大递归层测试:
  1. @echo off
  2. for /l %%a in (1,1,33) do setlocal&echo 第 %%a 层
  3. pause
复制代码
各层之间的继承关系演示:
  1. @echo off
  2. set/a a=1,b=1,c=1
  3. echo 0:%a%,%b%,%c%
  4. call:a
  5. echo 0_:%a%,%b%,%c%
  6. pause&exit
  7. :a
  8. setlocal
  9. set a=2
  10. echo a:%a%,%b%,%c%
  11. call:b
  12. echo a_:%a%,%b%,%c%
  13. goto:eof
  14. :b
  15. setlocal
  16. set b=2
  17. echo b:%a%,%b%,%c%
  18. call:c
  19. echo b_:%a%,%b%,%c%
  20. goto:eof
  21. :c
  22. setlocal
  23. set c=2
  24. echo c:%a%,%b%,%c%
复制代码

[ 本帖最后由 hanyeguxing 于 2010-12-28 19:54 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

  1. @echo off&setlocal enableDelayedExpansion
  2. for /l %%a in (1,1,8100) do set a=!a!0
  3. echo 完成初始化
  4. for /l %%a in (1,1,90000) do call:a %%a
  5. echo 完成测试
  6. pause&exit
  7. :a
  8. setlocal
  9. echo %1
  10. set #%1=%a%
复制代码
中间没有报任何错,显然子过程结束时执行了 EndLocal 。

[ 本帖最后由 hanyeguxing 于 2010-12-28 14:35 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

返回列表