中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
« [1] [2] [3] [4] »
作者:
标题: 什么情况下该使用变量延迟? 上一主题 | 下一主题
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『楼 主』:  什么情况下该使用变量延迟?

请问在什么情况下应该使用变量延迟?
格式是什么样的?
变量延迟又有什么作用呢?

   此帖被 -5 点积分     点击查看详情   
评分人:【 everest79 分数: 0  时间:2007-3-26 10:39
评分人:【 pzr 分数: +1  时间:2007-8-31 14:43
评分人:【 ab200210 分数: +2  时间:2007-10-1 16:40


2006-5-21 12:30
查看资料  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 2 楼』:  


───────────────── 版务记录 ─────────────────
执行: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 ]

   此帖被 +12 点积分        点击查看详情   
评分人:【 haiou327 分数: +4  时间:2008-1-4 21:38
评分人:【 plp626 分数: +4  时间:2008-1-25 06:24
评分人:【 zyz0304360 分数: +4  时间:2008-2-10 01:14




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-5-22 14:08
查看资料  发送邮件  发短消息 网志   编辑帖子
namejm
荣誉版主

batch fan


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

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

   此帖被 +22 点积分        点击查看详情   
评分人:【 xiaohacker 分数: +2  时间:2007-12-23 20:38
评分人:【 haiou327 分数: +4  时间:2008-1-4 21:36


2006-5-22 23:14
查看资料  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 4 楼』:  

Re namejm:

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

   此帖被 +2 点积分    点击查看详情   
评分人:【 hansom 分数: +2  时间:2008-5-28 00:28




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-5-23 00:23
查看资料  发送邮件  发短消息 网志   编辑帖子
namejm
荣誉版主

batch fan


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



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

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

嘿嘿,以前发错了两个帖子,共扣除16分,现在又蒙版主法外施仁,又全部补回来了,高兴.既然是模板的原因,错不在版主,请求其他版主对willsort版主不做扣分操作,同时对willsort版主勇于自责的负责任的态度深表钦佩.

2006-5-23 00:34
查看资料  发短消息 网志   编辑帖子
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 6 楼』:  

两位都这么诚恳,小弟才深表钦佩``

2006-9-22 23:43
查看资料  发送邮件  发短消息 网志   编辑帖子
jieok3375
中级用户





积分 282
发帖 130
注册 2006-9-20
来自 广东
状态 离线
『第 7 楼』:  

好像有点明白了。



~~~~好好学习
              天天向上~~~~
2006-10-19 04:57
查看资料  发送邮件  发短消息 网志  OICQ (147385156)  编辑帖子
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 8 楼』:  

还有在需要使用变量里套变量也可以使用变量延迟,如:
set a=1000
set b=dd
set a%b%=9000
set c=!a%b%!



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-10-19 08:41
查看资料  发送邮件  发短消息 网志   编辑帖子
hake
初级用户





积分 103
发帖 43
注册 2006-12-22
状态 离线
『第 9 楼』:  

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


你们的中文能好点吗?

2006-12-29 06:13
查看资料  发送邮件  发短消息 网志   编辑帖子
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 10 楼』:  

请问楼上有什么疑惑?可以说出来大家帮你。



三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2006-12-29 06:16
查看资料  发送邮件  发短消息 网志   编辑帖子
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 11 楼』:  

凡是要在for语句后,再次调用你

原先定义的变量

你就要用变量延迟

我终于搞定一个问题了

呵呵

2007-1-13 11:04
查看资料  发短消息 网志   编辑帖子
g4rr
初级用户





积分 68
发帖 32
注册 2007-1-24
来自 广东潮州
状态 离线
『第 12 楼』:  

应该是明白了.谢谢!

2007-1-28 15:59
查看资料  发送邮件  发短消息 网志   编辑帖子
gues1688
新手上路





积分 8
发帖 5
注册 2006-11-25
状态 离线
『第 13 楼』:  

延迟为何物,总算是知道了
谢谢willsort!

2007-1-29 02:43
查看资料  发送邮件  发短消息 网志   编辑帖子
hngaoshou
社区乞丐

gaoshou



积分 -16
发帖 77
注册 2007-1-30
状态 离线
『第 14 楼』:  

???
++++++++++分



:cool:
[swf=1,1]http://img63.imageshack.us/my.php?image=58098766zh0.swf[/swf]
2007-2-1 02:51
查看资料  发送邮件  发短消息 网志  OICQ (327869085)  编辑帖子
jmzsyt
新手上路





积分 10
发帖 5
注册 2006-11-21
状态 离线
『第 15 楼』:  

顶下~太高科技看不懂

2007-3-2 02:28
查看资料  发短消息 网志   编辑帖子
« [1] [2] [3] [4] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: