原帖由 greenworld 于 2010-12-28 10:45 发表
所以大概的结论是,call 会让 SetLocal EnableDelayedExpansion 开辟新的变量空间,此时对环境变量来说,相当于SetLocal...而SetLocal DisableDelayedExpansion则相当于endlocal
和 enabledelayedexpansion 、 disabledelayedexpansion 参数没有关系。
1,不要频繁使用setlocal,如果不及时Endlocal会造成超过最大允许递归层(xp下是32)
2,每次setlocal本地化时就开启了一个新的(子层)变量空间,并且保存新的变量变化,命令对变量的读写也在当前层(可从父层继承)。
而call返回后对变量的读写则回到了原来(父层)的变量空间。
最大递归层测试:- @echo off
- for /l %%a in (1,1,33) do setlocal&echo 第 %%a 层
- pause
复制代码 各层之间的继承关系演示:- @echo off
- set/a a=1,b=1,c=1
- echo 0:%a%,%b%,%c%
- call:a
- echo 0_:%a%,%b%,%c%
- pause&exit
- :a
- setlocal
- set a=2
- echo a:%a%,%b%,%c%
- call:b
- echo a_:%a%,%b%,%c%
- goto:eof
- :b
- setlocal
- set b=2
- echo b:%a%,%b%,%c%
- call:c
- echo b_:%a%,%b%,%c%
- goto:eof
- :c
- setlocal
- set c=2
- echo c:%a%,%b%,%c%
复制代码
[ 本帖最后由 hanyeguxing 于 2010-12-28 19:54 编辑 ] |