中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]关于"set & echo"变量替换的延迟
« [1] [2] »
作者:
标题: [已结]关于"set & echo"变量替换的延迟 上一主题 | 下一主题
0401
中级用户

带走



积分 435
发帖 88
注册 2005-9-24
状态 离线
『楼 主』:  [已结]关于"set & echo"变量替换的延迟

环境: XP 下面是我运行时的结果
C:\>set t=abc & echo %t%
%t%

C:\>set t=abc & echo %t%
abc

第一次运行时 并没有显示变量的值 我尝试把两句分开写保存为 bat 可以正常得到结果
但我不知道为何用 & 连结的无法得到期望的结果 以至于我运行 无奈何 大哥的个性签名得到这样的结果

C:\>%ComSpec% /cset,=^G何奈无── 。何奈可无是原,事奈无做人奈无^G&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul
%,:~22,1% %,:~21,1% %,:~20,1% %,:~19,1% %,:~18,1% %,:~17,1% %,:~16,1% %,:~15,1%
%,:~14,1% %,:~13,1% %,:~12,1% %,:~11,1% %,:~10,1% %,:~9,1% %,:~8,1% %,:~7,1% %,
:~6,1% %,:~5,1% %,:~4,1% %,:~3,1% %,:~2,1% %,:~1,1% %,:~0,1%

请问有什么解决方法吗?
还有上面我有一点不懂 为何他要用到 call 呢?

[ Last edited by 0401 on 2005-12-2 at 09:29 ]

2005-12-1 20:27
查看资料  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


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

Re 0401:

      无奈何的签名里已经提示得很清楚了,这句长代码是在开始运行中使用的,而非在命令行环境中。在命令行中需要去处最前面的 %comspec% /c ,而只保留从 set,= 以后的内容。

      至于 set & echo 源于变量替换的一种延迟效应。也就是说,在一个语句上的设置的变量,要到下一个语句才能正确引用。这种延迟效应的存在是源于命令行环境空间的共享问题,深谈起来比较复杂,可以 cmd /? 查阅有关说明。

      而签名中的 for 实际上是多次调用执行同一语句,n次调用的结果在n+1次调用时使用,再加上使用 ping 进行有意的延迟,造成了一字字的出现效果;另外,ping/n 1 127.1 在我这里不同时间段运行的延迟时间长短效果是不一样的,这应该与 127.1 这个 IP 地址有关,未做最后确定。


───────────────── 版务通知 ─────────────────
红色字体所示内容,目前认定为错误言论,敬请注意!
详细内容请参考 [原创]无奈何签名代码略析
http://www.cn-dos.net/forum/viewthread.php?tid=18838
───────────────── 版务通知 ─────────────────


[ Last edited by willsort on 2006-1-21 at 22:50 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2005-12-1 22:33
查看资料  发送邮件  发短消息 网志   编辑帖子
0401
中级用户

带走



积分 435
发帖 88
注册 2005-9-24
状态 离线
『第 3 楼』:  

谢谢 willsort 兄的提示 我似乎明白了点什么 不过还是不知为何 set t=abc & echo %t% 第一次得到的是 %t% 而不是 abc 呢

难道是两句一起执行 而不是先执行 "&" 前的语句再执行其后的语句

2005-12-1 23:13
查看资料  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


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

Re 0401:

      抱歉!未及时发现你的回复,而在原回帖中对你提到的某些问题进行了补充。



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





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 5 楼』:  

call 的作用是使取字符串部分的变量生效。
ping/n 1 127.1 和 ping/n 1 127.0.0.1 是等效的。

我做了两个版本,由于签名有200字符限制,另一个没有能贴上来。
我对这段签名代码的要求一是尽量字符最短二是尽量晦涩难读。
CMD 下试试这个,和我现用的签名一样长。
cls&(set,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul)&set,=




  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2005-12-2 00:34
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子
0401
中级用户

带走



积分 435
发帖 88
注册 2005-9-24
状态 离线
『第 6 楼』:  

我的疑问都解决了 谢谢大家!

以及感谢 无奈何 大哥提供的晦涩难读的代码 ^_^ 我发现了许多我没注意到的用法

2005-12-2 09:22
查看资料  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


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



  Quote:
Originally posted by 无奈何 at 2005-12-2 00:34:
ping/n 1 127.1 和 ping/n 1 127.0.0.1 是等效的。

Re 无奈何:

      既然如此,那么你可以查阅一下我在此处关于 ping 的延迟效应的探讨。[分享]批处理编程的异类——数学(http://www.cn-dos.net/forum/viewthread.php?tid=8905#pid54227) ,看看是否可以解释我在其中提到的疑惑或者指正其中的错漏,回复请至 [讨论]批处理编程的异类(http://www.cn-dos.net/forum/viewthread.php?tid=12388)。

[ Last edited by willsort on 2005-12-2 at 12:45 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2005-12-2 12:42
查看资料  发送邮件  发短消息 网志   编辑帖子
htysm
高级用户




积分 866
发帖 415
注册 2005-12-4
状态 离线
『第 8 楼』:  

DOS的批处理用到如此境界,在下真是佩服。

2005-12-4 11:32
查看资料  发送邮件  发短消息 网志   编辑帖子
bagpipe
银牌会员

DOS联盟捡破烂的


积分 1144
发帖 425
注册 2005-10-20
来自 北京
状态 离线
『第 9 楼』:  

(set t=abc)&echo %t%
楼主真逗,你那样当然不成了,别忘了  set后面是空格哈,当然这条不运行了,只运行下面的语句了,你试试上面的就知道了,编写的时候有些不太认真!

2005-12-5 13:44
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子
tianzizhi
高级用户




积分 622
发帖 214
注册 2006-9-22
状态 离线
『第 10 楼』:  

(set t=abc)&echo %t%也不行,效果和set t=abc&echo %t%一样,都是第二次运行才正确显示,bagpipe兄试验过了吗?

[ Last edited by tianzizhi on 2006-11-6 at 03:22 AM ]

2006-11-6 03:21
查看资料  发送邮件  发短消息 网志  OICQ (419503077)  编辑帖子
jianyaogao
初级用户




积分 49
发帖 22
注册 2005-8-4
状态 离线
『第 11 楼』:  

变量延迟效应

2007-3-17 22:21
查看资料  发送邮件  发短消息 网志   编辑帖子
jianyaogao
初级用户




积分 49
发帖 22
注册 2005-8-4
状态 离线
『第 12 楼』:  

强人就是强人

2007-3-18 01:35
查看资料  发送邮件  发短消息 网志   编辑帖子
axi
中级用户

脚本爱好者


积分 238
发帖 93
注册 2007-3-11
来自 GZ
状态 离线
『第 13 楼』:  

阅读高手们的分析,简直是一种享受!

2007-3-18 01:58
查看资料  发短消息 网志  OICQ (453623262)  编辑帖子
kkoper
新手上路





积分 16
发帖 8
注册 2007-3-25
状态 离线
『第 14 楼』:  

set t=abc & call & echo %t%

这样就可以了嘛!

2007-3-25 23:35
查看资料  发送邮件  发短消息 网志   编辑帖子
lp1129
初级用户





积分 186
发帖 92
注册 2007-3-27
状态 离线
『第 15 楼』:  

楼上还是不行的,要在前面加变量延迟命令的

@echo off&setlocal EnableDelayedExpansion
set t=abc&echo !t!
pause

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


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



论坛跳转: