中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 我对“变量延迟”的一些理解!(还未解决!)
作者:
标题: 我对“变量延迟”的一些理解!(还未解决!) 上一主题 | 下一主题
hangyug
初级用户




积分 99
发帖 43
注册 2007-1-12
状态 离线
『楼 主』:  我对“变量延迟”的一些理解!(还未解决!)

感觉变量延迟挺折磨人的,研究了好久,还查找了一些帖子,终于明白一些了,我是这样理解的,请帮忙指正一下。
由于光说的话太抽象,所以我举一个例子:
是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 ]



我很菜,但我很努力~
2007-1-26 05:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bbq123bbq
初级用户




积分 197
发帖 77
注册 2006-9-19
状态 离线
『第 2 楼』:  

@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!
      )

2007-1-26 05:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 3 楼』:  



  Quote:
Originally posted by hangyug at 2007-1-25 16:06:
那么执行set n=%%i语句之后,%n%便会赋值为hello world,然后执行下一句set n=%n:ld.=t% ,执行之后,可以把hello world 中的ld.替换成t

这句理解是错误的!

未启用延迟时

凡是在括号内的变量都已经被替换成括号前变量的值

在上个例子中

for的括号开始前%n%没有定义

所以括号内对变量的引用始终未空

所以虽然括号内的每个set语句都有效

但只有最后一个set决定n的值

而最后的set所引用的变量%n%还仍然是空值

[ Last edited by qzwqzw on 2007-1-25 at 06:37 PM ]

2007-1-26 07:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
hangyug
初级用户




积分 99
发帖 43
注册 2007-1-12
状态 离线
『第 4 楼』:  

对楼上的回答还是有一点不太懂。你说了,“未启用延迟时,凡是在括号内的变量都已经被替换成括号前变量的值” ,那么按照你所说的,在括号中的%n%一开始不就已经被赋值为%%i(也就是hello world)了吗,你怎么说开始前%n%没有定义啊?
请给再解释一下啊。谢谢。



我很菜,但我很努力~
2007-1-26 12:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qasa
高级用户




积分 959
发帖 311
注册 2006-4-11
来自 广东-LianJiang
状态 离线
『第 5 楼』:  



  Quote:
Originally posted by hangyug at 2007-1-26 12:05:
对楼上的回答还是有一点不太懂。你说了,“未启用延迟时,凡是在括号内的变量都已经被替换成括号前变量的值” ,那么按照你所说的,在括号中的 ...

因为在执行for请语句之前,%n%变量还没有被定义。如果不用延迟变量的话,
在for执行中使用的是之前的定义值。但之前没有定义,所以是空值。




κχυμγνξοθπρωψιαδλεηφβτζσ┬╀┾┳┞┯┰┱┣┲┳╂╁│├┟┭┠这是什么??这就是我的人生
2007-1-26 12:37
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
hangyug
初级用户




积分 99
发帖 43
注册 2007-1-12
状态 离线
『第 6 楼』:  

下面的代码:
@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!
      )
执行结果为He=Wi  ,谁能給解释一下,为什么?如果这个懂了,我估计我就懂了,所以请指点一下。

[ Last edited by hangyug on 2007-1-26 at 10:44 AM ]



我很菜,但我很努力~
2007-1-26 23:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 7 楼』:  

  虽然你启用了变量延迟,但是,在for语句的do部分,前面的所有赋值语句却没有使用这个功能,只是用普通的单百分号对简单地给变量赋值。去掉@echo off 再在最后加上pause语句,你就会看到,当命令解释器进行预处理的时候,do后面所有的最外层百分号被脱去,执行的结果依次为 Hello world、n:ld.=t、n:o w= S、He=Wi,解决的办法是:把所有的单百分号对换成感叹号对。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-1-27 00:22
查看资料  发短消息 网志   编辑帖子  回复  引用回复
hangyug
初级用户




积分 99
发帖 43
注册 2007-1-12
状态 离线
『第 8 楼』:  

namejm版主:
按你说的,我去掉了@echo off,加上了pause,看到了执行的过程。确实,在执行的过程中脱去了两边的%,但是为什么连set语句中的n:一起脱去了,换句话说为什么执行结果是He=Wi 而不是n:He=Wi ?

[ Last edited by hangyug on 2007-1-28 at 10:42 AM ]



我很菜,但我很努力~
2007-1-27 11:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
hangyug
初级用户




积分 99
发帖 43
注册 2007-1-12
状态 离线
『第 9 楼』:  

谁再来给解答一下啊,,,帖子快沉了啊!!!



我很菜,但我很努力~
2007-1-28 07:24
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: