|
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 |
|
|
0401
中级用户
带走
积分 435
发帖 88
注册 2005-9-24
状态 离线
|
『第
6 楼』:
我的疑问都解决了 谢谢大家!
以及感谢 无奈何 大哥提供的晦涩难读的代码 ^_^ 我发现了许多我没注意到的用法
|
|
2005-12-2 09:22 |
|
|
willsort
元老会员
Batchinger
积分 4432
发帖 1512
注册 2002-10-18
状态 离线
|
|
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 |
|
|
jianyaogao
初级用户
积分 49
发帖 22
注册 2005-8-4
状态 离线
|
|
2007-3-17 22:21 |
|
|
jianyaogao
初级用户
积分 49
发帖 22
注册 2005-8-4
状态 离线
|
|
2007-3-18 01:35 |
|
|
axi
中级用户
脚本爱好者
积分 238
发帖 93
注册 2007-3-11 来自 GZ
状态 离线
|
『第
13 楼』:
阅读高手们的分析,简直是一种享受!
|
|
2007-3-18 01:58 |
|
|
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 |
|
|