Board logo

标题: 什么情况下该使用变量延迟? [打印本页]

作者: namejm     时间: 2006-5-21 12:30    标题: 什么情况下该使用变量延迟?

请问在什么情况下应该使用变量延迟?
格式是什么样的?
变量延迟又有什么作用呢?
作者: willsort     时间: 2006-5-22 14:08

───────────────── 版务记录 ─────────────────
执行:Will Sort
操作:移动主题:自《DOS疑難解答 & 問題討論 (解答室)》
说明:依照主题内容分类,更适合于发表在此版区
提示:原版区转向链接三日后将删除
处罚:扣除因发表该主题而奖励的6点积分,版区违规惩罚性扣除2点积分
───────────────── 版务记录 ─────────────────

Re namejm:

      关于环境变量延迟扩展,使用set /?可以查看到部分说明,不过考虑到其粗劣的翻译水平,建议在查看之前,首先chcp 437切换为英文查看原英文说明。鉴于文中已说得十分详尽,而且有数个代码示例,应该不难理解。在此仅略作一些补充。

      在许多可见的官方文档中,均将使用一对百分号闭合环境变量以完成对其值的替换行为称之为“扩展(expansion)”,这其实是一个第一方的概念,是从命令解释器的角度进行称谓的,而从我们使用者的角度来看,则可以将它看作是引用(Reference)、调用(Call)或者获取(Get)。

      而命令解释器是扩展环境变量的行为大致如下:首先读取命令行的一条完整语句,在进行一些先期的预处理之后,命令被解释执行之前,会对其中用百分号闭合的字符串进行匹配,如果在环境空间中找到了与字符串相匹配的环境变量,则用其值替换掉原字符串及百分号本身,如果未得到匹配,则用一个空串替换,这个过程就是环境变量的“扩展”,它仍然属于命令行的预处理范畴。

      而一条“完整的语句”,在NT的命令解释器CMD中被解释为“for if else”等含有语句块的语句和用“& | && ||”等连接起来的复合语句。

      因此,当CMD读取for语句时,其后用一对圆扩号闭合的所有语句将一同读取,并完成必要的预处理工作,这其中就包括环境变量的扩展,所以在for中的所有语句执行之前,所有的环境变量都已经被替换为for之前所设定的值,从而成为一个字符串常量,而不再是变量。无论在for中将那些环境变量如何修改,真正受到影响的只是环境变量空间,而非for语句内部。
      
      而为了能够在for语句内部感知环境变量的动态变化,CMD设计了延迟的环境变量扩展特性,也就是说,当CMD读取了一条完整的语句之后,它不会立即执行变量的扩展行为,而会在某个单条语句执行之前再进行扩展,也就是说,这个扩展行为被“延迟”了。

      延迟环境变量扩展特性在CMD中缺省是关闭的,开启它的方法目前有两个:一是CMD /v:off此处说法有误,应为 CMD /v:on——namejm 注),它会打开一个新的命令行外壳,在使用exit退出这个外壳之前,扩展特性始终有效,常用于命令行环境中;二是setlocal EnableDelayedExpansion,它会使环境变量的修改限制到局部空间中,在endlocal之后,扩展特性和之前对环境变量的修改将一同消失,常用于批处理语句中。

[ Last edited by namejm on 2007-3-17 at 09:01 PM ]
作者: namejm     时间: 2006-5-22 23:14
谢谢willsort的详细解答.set /?的中文帮助看得似懂非懂,主要是里面有几个生涩的术语,看了willsort的解释之后,才明白"扩展"原来就是常用的引用、调用之类的动作,有种恍然大悟的感觉.
原来在《DOS疑難解答 & 問題討論 (解答室)》这个版块发帖求助习惯了,新版开张之后,一下子还没转过弯来,造成了发帖发错地方的错误,给版主的管理带来了麻烦,在此深表歉意.但是对"扣除标题违规惩罚性2点积分"这一条,我觉得挺冤枉,因为我的标题似乎没有引起歧义或者大而无边之类的错误,如果说我发错地方了要对我进行附加惩罚扣分,我没什么异议,但是"标题违规"这个说法似乎不妥当.个人意见,请版主指正.
作者: willsort     时间: 2006-5-23 00:23
Re namejm:

      多谢细心指出版务记录中的笔误,现已做出修正,这个版本的版务记录模板已经使用了月余,第一次有人能指出其中的笔误;同时感于兄的诚恳,为此奖励3楼回复帖16点积分,同时提请批处理室其它版主扣除2楼的回复帖相应的16点积分,因为我无法对自己的回复进行评分。
作者: namejm     时间: 2006-5-23 00:34


  Quote:
Originally posted by willsort at 2006-5-23 00:23:
Re namejm:

      多谢细心指出版务记录中的笔误,现已做出修正,这个版本的版务记录模板已经使用了月余,第一次有人能指出其中的笔误;同时感于兄的诚恳,为此奖励3楼回复帖16点积分,同时提请批处理室其它版主扣除2楼的回复帖相应的16点积分,因为我无法对自己的回复进行评分。

嘿嘿,以前发错了两个帖子,共扣除16分,现在又蒙版主法外施仁,又全部补回来了,高兴.既然是模板的原因,错不在版主,请求其他版主对willsort版主不做扣分操作,同时对willsort版主勇于自责的负责任的态度深表钦佩.
作者: lxmxn     时间: 2006-9-22 23:43
两位都这么诚恳,小弟才深表钦佩``
作者: jieok3375     时间: 2006-10-19 04:57
好像有点明白了。
作者: 不得不爱     时间: 2006-10-19 08:41
还有在需要使用变量里套变量也可以使用变量延迟,如:
set a=1000
set b=dd
set a%b%=9000
set c=!a%b%!
作者: hake     时间: 2006-12-29 06:13
关于环境变量延迟扩展,使用set /?可以查看到部分说明,不过考虑到其粗劣的翻译水平,建议在查看之前,首先chcp 437切换为英文查看原英文说明。鉴于文中已说得十分详尽,而且有数个代码示例,应该不难理解。在此仅略作一些补充。


你们的中文能好点吗?
作者: ccwan     时间: 2006-12-29 06:16
请问楼上有什么疑惑?可以说出来大家帮你。
作者: scriptor     时间: 2007-1-13 11:04
凡是要在for语句后,再次调用你

原先定义的变量

你就要用变量延迟

我终于搞定一个问题了

呵呵
作者: g4rr     时间: 2007-1-28 15:59
应该是明白了.谢谢!
作者: gues1688     时间: 2007-1-29 02:43
延迟为何物,总算是知道了
谢谢willsort!
作者: hngaoshou     时间: 2007-2-1 02:51
???
++++++++++分
作者: jmzsyt     时间: 2007-3-2 02:28
顶下~太高科技看不懂
作者: jianyaogao     时间: 2007-3-18 00:09
got it
作者: swallow     时间: 2007-3-26 09:02
谢谢,解惑了。
作者: hngaoshou     时间: 2007-3-28 13:31
好 。。。。。
作者: wudixin96     时间: 2007-3-31 05:50
总算解决了。困扰偶N久的疑问了。谢谢
作者: twotwo789     时间: 2007-4-3 02:55
谢谢willsort!
作者: mtiankong     时间: 2007-4-11 03:01
感谢WILLSORT
作者: testdamao     时间: 2007-4-20 02:20
看不懂啊!!太高深了!!
作者: mtiankong     时间: 2007-5-8 23:23
感谢willsort版主给我们这些新手的讲解
作者: tyh     时间: 2007-5-18 16:54
凡是要在for语句后,再次调用你

原先定义的变量

你就要用变量延迟


还是不太明白啊。
作者: kucool     时间: 2007-6-10 16:09
找到答案,找到个好论坛。hoho~~!!!
作者: pcqq     时间: 2007-7-6 11:04
顶下~``````````
作者: rockdong     时间: 2007-8-29 10:34
对这个问题,一直感到很疑惑,现在好象有点方向了!:P
作者: hxwxyz     时间: 2007-9-10 15:02
好象明白了   呵呵  谢谢
作者: hxwxyz     时间: 2007-9-10 15:07
好象明白了   呵呵  谢谢
作者: ab200210     时间: 2007-10-2 14:00
好象晕了
作者: xx12212     时间: 2007-10-2 16:46
比较高深,我看了好几遍才有点明白.
作者: kgdetg1127     时间: 2007-10-12 21:52
顶上去,牛BI的
作者: buzhaiwen     时间: 2007-10-19 13:56
看了N遍,终于有些端倪.
UP.Will Sort............
作者: buzhaiwen     时间: 2007-10-19 13:57
看了N遍,终于有些端倪.
UP.Will Sort............
作者: techon     时间: 2007-11-9 16:26
好贴啊

自己搞了好久都没弄明白
看了这个帖子终于茅塞顿开
作者: techon     时间: 2007-11-9 16:26
好贴啊

自己搞了好久都没弄明白
看了这个帖子终于茅塞顿开
作者: kootoo     时间: 2007-11-10 12:57
有点懂了
作者: vlem     时间: 2007-11-14 09:18
学习
感觉这个论坛的气氛很好
受益颇多
作者: penghuahui     时间: 2007-12-13 19:44
懂一点点
作者: penghuahui     时间: 2007-12-13 19:45
懂一点点
作者: xiaohacker     时间: 2007-12-23 20:42
看了N遍,终于有了点感觉!!!
作者: whzcy     时间: 2007-12-24 16:23    标题: 顶.支持

请各位高手多发这种解惑的贴子.
作者: haiou327     时间: 2008-1-4 21:37
很好的帖子,加分
作者: jinde22     时间: 2008-1-23 01:41
谢谢...
作者: jinde22     时间: 2008-1-23 01:42
谢谢...
作者: shuiyin313     时间: 2008-1-23 14:03
DELAY 能不能用?
作者: zyz0304360     时间: 2008-2-10 01:04
willsort

解释的太棒了

受益非浅

感谢您的付出


此贴含金量高,收藏了
作者: jinlizhpc     时间: 2008-2-10 17:53
使用使用变量延迟是不是延时执行程序?
作者: pinghu     时间: 2008-2-10 22:25
大力支持!!很精辟的见解!我进步的台阶!
作者: itseeker     时间: 2008-2-12 15:57
授道解惑!
作者: dslz666     时间: 2008-2-20 19:15
看了好多次都没看懂,,晕死了
作者: faultcode     时间: 2008-3-3 20:43
呵呵 偶然翻到 原来namejm高手们也是这么过来的啊~~
作者: dreammy     时间: 2008-3-16 14:24    标题: hehe

dong le ha xie xie
作者: bat-zw     时间: 2008-4-10 12:50    标题: 原来是这么回事:

原以为自己对变量延迟已经很了解了,今日重又仔细拜读了老大的牛贴后才发现我的理解还是有很大的差误,谢谢老大,顶了!!!
作者: vversatile     时间: 2008-4-25 12:46
还得多多领悟哦,呵呵
作者: wgx1688     时间: 2008-7-11 14:05
哎太菜现在还没看懂~
作者: wgx1688     时间: 2008-7-11 14:06
哎太菜现在还没看懂~
作者: killkk     时间: 2008-10-9 22:45
菜鸟飞过。。。蛤蛤。。
作者: yaxixingye     时间: 2008-11-15 00:12
够乱 勉强看懂...有没看懂...