中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-05 17:02
48,039 主题排行 / 350,124 发帖 / 今日 2 篇 / 48,251 会员排行
DOS批处理 & 脚本技术(批处理室) » 什么情况下该使用变量延迟?
可打印版本  38,932 / 58
第1楼 namejm 发表于 2006-05-21 12:30
荣誉版主 发帖 1,737 积分 5,226 来自 成都
什么情况下该使用变量延迟?
请问在什么情况下应该使用变量延迟?
格式是什么样的?
变量延迟又有什么作用呢?
第2楼 willsort 发表于 2006-05-22 14:08
元老会员 发帖 1,512 积分 4,432

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

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

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


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


你们的中文能好点吗?
第10楼 ccwan 发表于 2006-12-29 06:16
金牌会员 发帖 1,160 积分 2,725 来自 河北廊坊
请问楼上有什么疑惑?可以说出来大家帮你。
第11楼 scriptor 发表于 2007-01-13 11:04
银牌会员 发帖 555 积分 1,187
凡是要在for语句后,再次调用你

原先定义的变量

你就要用变量延迟

我终于搞定一个问题了

呵呵
第12楼 g4rr 发表于 2007-01-28 15:59
初级用户 发帖 32 积分 68 来自 广东潮州
应该是明白了.谢谢!
第13楼 gues1688 发表于 2007-01-29 02:43
新手上路 发帖 5 积分 8
延迟为何物,总算是知道了
谢谢willsort!
第14楼 hngaoshou 发表于 2007-02-01 02:51
社区乞丐 发帖 77 积分 -16
???
++++++++++分
第15楼 jmzsyt 发表于 2007-03-02 02:28
新手上路 发帖 5 积分 10
顶下~太高科技看不懂
1 2 3 4  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023