Board logo

标题: [已结]关于"set & echo"变量替换的延迟 [打印本页]

作者: 0401     时间: 2005-12-1 20:27    标题: [已结]关于"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 ]
作者: willsort     时间: 2005-12-1 22:33
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 ]
作者: 0401     时间: 2005-12-1 23:13
谢谢 willsort 兄的提示 我似乎明白了点什么 不过还是不知为何 set t=abc & echo %t% 第一次得到的是 %t% 而不是 abc 呢

难道是两句一起执行 而不是先执行 "&" 前的语句再执行其后的语句
作者: willsort     时间: 2005-12-1 23:19
Re 0401:

      抱歉!未及时发现你的回复,而在原回帖中对你提到的某些问题进行了补充。
作者: 无奈何     时间: 2005-12-2 00:34
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,=

作者: 0401     时间: 2005-12-2 09:22
我的疑问都解决了 谢谢大家!

以及感谢 无奈何 大哥提供的晦涩难读的代码 ^_^ 我发现了许多我没注意到的用法
作者: willsort     时间: 2005-12-2 12:42


  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 ]
作者: htysm     时间: 2005-12-4 11:32
DOS的批处理用到如此境界,在下真是佩服。
作者: bagpipe     时间: 2005-12-5 13:44
(set t=abc)&echo %t%
楼主真逗,你那样当然不成了,别忘了  set后面是空格哈,当然这条不运行了,只运行下面的语句了,你试试上面的就知道了,编写的时候有些不太认真!
作者: tianzizhi     时间: 2006-11-6 03:21
(set t=abc)&echo %t%也不行,效果和set t=abc&echo %t%一样,都是第二次运行才正确显示,bagpipe兄试验过了吗?

[ Last edited by tianzizhi on 2006-11-6 at 03:22 AM ]
作者: jianyaogao     时间: 2007-3-17 22:21
变量延迟效应
作者: jianyaogao     时间: 2007-3-18 01:35
强人就是强人
作者: axi     时间: 2007-3-18 01:58
阅读高手们的分析,简直是一种享受!
作者: kkoper     时间: 2007-3-25 23:35
set t=abc & call & echo %t%

这样就可以了嘛!
作者: lp1129     时间: 2007-3-28 00:39
楼上还是不行的,要在前面加变量延迟命令的

@echo off&setlocal EnableDelayedExpansion
set t=abc&echo !t!
pause
作者: lxmxn     时间: 2007-3-28 00:47

14楼的call和echo中间多了一个&符号,所以不行,去掉即可。

作者: tongwandou     时间: 2007-4-19 11:37
学习了!谢谢
作者: hngaoshou     时间: 2007-5-2 21:18
批处理中:
set,=123&call,echo %%,%%
cmd下
set,=123&call,echo %,%

[ Last edited by hngaoshou on 2007-5-2 at 09:20 PM ]
作者: hxwxyz     时间: 2007-9-10 15:41
高手就是高手
作者: pjyhl82     时间: 2007-9-11 23:53
批文件果然高深,谢谢大大指教
作者: penghuahui     时间: 2007-12-13 19:51
看不懂呀
厉害厉害
作者: testdamao     时间: 2008-11-16 16:00
太厉害了,学习