中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-14 18:57
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 什么情况下该使用变量延迟?
楼 主 什么情况下该使用变量延迟? 发表于 2006-05-21 12:30 ·  中国 四川 成都 鹏博士宽带
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
请问在什么情况下应该使用变量延迟?
格式是什么样的?
变量延迟又有什么作用呢?
本帖最近评分记录 (共 3 条) 点击查看详情
评分人分数时间
everest79 0 2007-03-26 10:39
pzr +1 2007-08-31 14:43
ab200210 +2 2007-10-01 16:40
2 发表于 2006-05-22 14:08 ·  中国 山西 大同 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线

───────────────── 版务记录 ─────────────────
执行: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 条) 点击查看详情
评分人分数时间
haiou327 +4 2008-01-04 21:38
plp626 +4 2008-01-25 06:24
zyz0304360 +4 2008-02-10 01:14
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
3 发表于 2006-05-22 23:14 ·  中国 四川 成都 鹏博士宽带
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
谢谢willsort的详细解答.set /?的中文帮助看得似懂非懂,主要是里面有几个生涩的术语,看了willsort的解释之后,才明白"扩展"原来就是常用的引用、调用之类的动作,有种恍然大悟的感觉.
原来在《DOS疑難解答 & 問題討論 (解答室)》这个版块发帖求助习惯了,新版开张之后,一下子还没转过弯来,造成了发帖发错地方的错误,给版主的管理带来了麻烦,在此深表歉意.但是对"扣除标题违规惩罚性2点积分"这一条,我觉得挺冤枉,因为我的标题似乎没有引起歧义或者大而无边之类的错误,如果说我发错地方了要对我进行附加惩罚扣分,我没什么异议,但是"标题违规"这个说法似乎不妥当.个人意见,请版主指正.
本帖最近评分记录 (共 2 条) 点击查看详情
评分人分数时间
xiaohacker +2 2007-12-23 20:38
haiou327 +4 2008-01-04 21:36
4 发表于 2006-05-23 00:23 ·  中国 山西 运城 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线
Re namejm:

多谢细心指出版务记录中的笔误,现已做出修正,这个版本的版务记录模板已经使用了月余,第一次有人能指出其中的笔误;同时感于兄的诚恳,为此奖励3楼回复帖16点积分,同时提请批处理室其它版主扣除2楼的回复帖相应的16点积分,因为我无法对自己的回复进行评分。
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
hansom +2 2008-05-28 00:28
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
5 发表于 2006-05-23 00:34 ·  中国 四川 成都 鹏博士宽带
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
Originally posted by willsort at 2006-5-23 00:23:
Re namejm:

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


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


你们的中文能好点吗?
10 发表于 2006-12-29 06:16 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
UID 63486
来自 河北廊坊
状态 离线
请问楼上有什么疑惑?可以说出来大家帮你。
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
11 发表于 2007-01-13 11:04 ·  中国 北京 中国科学院研究生院
银牌会员
★★★
积分 1,187
发帖 555
注册 2006-12-21 07:35
UID 74129
性别 男
状态 离线
凡是要在for语句后,再次调用你

原先定义的变量

你就要用变量延迟

我终于搞定一个问题了

呵呵
12 发表于 2007-01-28 15:59 ·  中国 广东 广州 番禺区 电信
初级用户
积分 68
发帖 32
注册 2007-01-24 04:00
UID 77490
性别 男
来自 广东潮州
状态 离线
应该是明白了.谢谢!
13 发表于 2007-01-29 02:43 ·  中国 福建 三明 电信
新手上路
积分 8
发帖 5
注册 2006-11-25 05:53
UID 71670
性别 男
状态 离线
延迟为何物,总算是知道了
谢谢willsort!
14 发表于 2007-02-01 02:51 ·  中国 湖南 长沙 联通
社区乞丐
★★
gaoshou
积分 -16
发帖 77
注册 2007-01-30 09:11
UID 78105
性别 男
状态 离线
???
++++++++++分
:cool:
15 发表于 2007-03-02 02:28 ·  中国 山东 青岛 联通
新手上路
积分 10
发帖 5
注册 2006-11-21 04:48
UID 71206
性别 男
状态 离线
顶下~太高科技看不懂
论坛跳转: