感觉变量延迟挺折磨人的,研究了好久,还查找了一些帖子,终于明白一些了,我是这样理解的,请帮忙指正一下。
由于光说的话太抽象,所以我举一个例子:
是willsort版主的代码:
@echo off & setlocal EnableDelayedExpansion
for /f "tokens=* delims=" %%i in ("Hello world.") do (
set n=%%i
set n=!n:ld.=t!
set n=!n:o w= S!
set n=!n:He=Wi!
echo !n!
)
我是这样理解的:如果这段代码不使用变量延迟,那么执行set n=%%i语句之后,%n%便会赋值为hello world,然后执行下一句set n=%n:ld.=t% ,执行之后,可以把hello world 中的ld.替换成t。再执行下一句,set n=%n:o w= S%
这时,问题出现了,由于没启用变量延迟,这句话只是把hello world中的o w替换成了s,而不是把hello wort中的o w替换成s,换句话说,就是%n%的值一早就已经定死了,不能再动态变化了。
当启用变量延迟一后,情况就不一样了,它可以使变量始终保持在动态变化之中,执行set n=!n:ld.=t! ,把hello world 中的ld.替换成t。这时%n%的值就是hello wort,然后执行set n=!n:o w= S!,把hello wort中的o w 替换成s,
依此类推......
我就是这么理解的,但是我又执行了以下代码:
@echo off
for /f "tokens=* delims=" %%i in ("Hello world.") do (
set n=%%i
set n=%n:ld.=t%
set n=%n:o w= S%
set n=%n:He=Wi%
echo %n%
)
要是按照我所理解的,执行结果应该是willo word,,,
也就是只对变量%n%(hello world),执行了最后一句set n=%n:He=Wi%
但是,执行结果却是 “echo处于关闭”
所以,请高手指点一下,我哪理解错了?
深表感谢!
[ Last edited by hangyug on 2007-1-27 at 08:53 PM ]
由于光说的话太抽象,所以我举一个例子:
是willsort版主的代码:
@echo off & setlocal EnableDelayedExpansion
for /f "tokens=* delims=" %%i in ("Hello world.") do (
set n=%%i
set n=!n:ld.=t!
set n=!n:o w= S!
set n=!n:He=Wi!
echo !n!
)
我是这样理解的:如果这段代码不使用变量延迟,那么执行set n=%%i语句之后,%n%便会赋值为hello world,然后执行下一句set n=%n:ld.=t% ,执行之后,可以把hello world 中的ld.替换成t。再执行下一句,set n=%n:o w= S%
这时,问题出现了,由于没启用变量延迟,这句话只是把hello world中的o w替换成了s,而不是把hello wort中的o w替换成s,换句话说,就是%n%的值一早就已经定死了,不能再动态变化了。
当启用变量延迟一后,情况就不一样了,它可以使变量始终保持在动态变化之中,执行set n=!n:ld.=t! ,把hello world 中的ld.替换成t。这时%n%的值就是hello wort,然后执行set n=!n:o w= S!,把hello wort中的o w 替换成s,
依此类推......
我就是这么理解的,但是我又执行了以下代码:
@echo off
for /f "tokens=* delims=" %%i in ("Hello world.") do (
set n=%%i
set n=%n:ld.=t%
set n=%n:o w= S%
set n=%n:He=Wi%
echo %n%
)
要是按照我所理解的,执行结果应该是willo word,,,
也就是只对变量%n%(hello world),执行了最后一句set n=%n:He=Wi%
但是,执行结果却是 “echo处于关闭”
所以,请高手指点一下,我哪理解错了?
深表感谢!
[ Last edited by hangyug on 2007-1-27 at 08:53 PM ]
