![]() |
中国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: 嘿嘿,以前发错了两个帖子,共扣除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 |