![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-13 23:14 |
共 47,812 主题排行 / 349,916 发帖 / 今日 0 篇 / 48,268 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [已结]关于"set & echo"变量替换的延迟 |
| 可打印版本 6,191 / 21 |
| 第1楼 0401 | 发表于 2005-12-01 20:27 |
| 中级用户 发帖 88 积分 435 | |
|
[已结]关于"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 ] |
|
| 第2楼 willsort | 发表于 2005-12-01 22:33 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
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 ] |
|
| 第3楼 0401 | 发表于 2005-12-01 23:13 |
| 中级用户 发帖 88 积分 435 | |
|
谢谢 willsort 兄的提示 我似乎明白了点什么 不过还是不知为何 set t=abc & echo %t% 第一次得到的是 %t% 而不是 abc 呢
难道是两句一起执行 而不是先执行 "&" 前的语句再执行其后的语句 |
|
| 第4楼 willsort | 发表于 2005-12-01 23:19 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
Re 0401:
抱歉!未及时发现你的回复,而在原回帖中对你提到的某些问题进行了补充。 |
|
| 第5楼 无奈何 | 发表于 2005-12-02 00:34 |
| 荣誉版主 发帖 356 积分 1,338 | |
|
call 的作用是使取字符串部分的变量生效。
ping/n 1 127.1 和 ping/n 1 127.0.0.1 是等效的。 我做了两个版本,由于签名有200字符限制,另一个没有能贴上来。 我对这段签名代码的要求一是尽量字符最短二是尽量晦涩难读。 CMD 下试试这个,和我现用的签名一样长。 |
|
| 第6楼 0401 | 发表于 2005-12-02 09:22 |
| 中级用户 发帖 88 积分 435 | |
|
我的疑问都解决了 谢谢大家!
以及感谢 无奈何 大哥提供的晦涩难读的代码 ^_^ 我发现了许多我没注意到的用法 |
|
| 第7楼 willsort | 发表于 2005-12-02 12:42 |
| 元老会员 发帖 1,512 积分 4,432 | |
Originally posted by 无奈何 at 2005-12-2 00:34: 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 ] |
|
| 第8楼 htysm | 发表于 2005-12-04 11:32 |
| 高级用户 发帖 415 积分 866 | |
|
DOS的批处理用到如此境界,在下真是佩服。
|
|
| 第9楼 bagpipe | 发表于 2005-12-05 13:44 |
| 银牌会员 发帖 425 积分 1,144 来自 北京 | |
|
(set t=abc)&echo %t%
楼主真逗,你那样当然不成了,别忘了 set后面是空格哈,当然这条不运行了,只运行下面的语句了,你试试上面的就知道了,编写的时候有些不太认真! |
|
| 第10楼 tianzizhi | 发表于 2006-11-06 03:21 |
| 高级用户 发帖 214 积分 623 | |
|
(set t=abc)&echo %t%也不行,效果和set t=abc&echo %t%一样,都是第二次运行才正确显示,bagpipe兄试验过了吗?
[ Last edited by tianzizhi on 2006-11-6 at 03:22 AM ] |
|
| 第11楼 jianyaogao | 发表于 2007-03-17 22:21 |
| 初级用户 发帖 22 积分 49 | |
|
变量延迟效应
|
|
| 第12楼 jianyaogao | 发表于 2007-03-18 01:35 |
| 初级用户 发帖 22 积分 49 | |
|
强人就是强人
|
|
| 第13楼 axi | 发表于 2007-03-18 01:58 |
| 中级用户 发帖 93 积分 238 来自 GZ | |
|
阅读高手们的分析,简直是一种享受!
|
|
| 第14楼 kkoper | 发表于 2007-03-25 23:35 |
| 新手上路 发帖 8 积分 16 | |
|
set t=abc & call & echo %t%
这样就可以了嘛! |
|
| 第15楼 lp1129 | 发表于 2007-03-28 00:39 |
| 初级用户 发帖 92 积分 186 | |
|
楼上还是不行的,要在前面加变量延迟命令的
@echo off&setlocal EnableDelayedExpansion set t=abc&echo !t! pause |
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |