中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-07-23 05:06
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]关于"set & echo"变量替换的延迟 查看 5,870 回复 21
楼 主 [已结]关于"set & echo"变量替换的延迟 发表于 2005-12-01 20:27 ·  中国 福建 漳州 电信
中级用户
★★
带走
积分 435
发帖 88
注册 2005-09-24 19:22
20年会员
UID 42793
状态 离线
环境: 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 发表于 2005-12-01 22:33 ·  中国 山西 大同 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
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:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
3 发表于 2005-12-01 23:13 ·  中国 福建 漳州 电信
中级用户
★★
带走
积分 435
发帖 88
注册 2005-09-24 19:22
20年会员
UID 42793
状态 离线
谢谢 willsort 兄的提示 我似乎明白了点什么 不过还是不知为何 set t=abc & echo %t% 第一次得到的是 %t% 而不是 abc 呢

难道是两句一起执行 而不是先执行 "&" 前的语句再执行其后的语句
4 发表于 2005-12-01 23:19 ·  中国 山西 大同 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
Re 0401:

抱歉!未及时发现你的回复,而在原回帖中对你提到的某些问题进行了补充。
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
5 发表于 2005-12-02 00:34 ·  中国 辽宁 锦州 中移铁通
荣誉版主
★★★
积分 1,338
发帖 356
注册 2005-07-15 12:09
21年会员
UID 40733
性别 男
状态 离线
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

6 发表于 2005-12-02 09:22 ·  中国 福建 漳州 电信
中级用户
★★
带走
积分 435
发帖 88
注册 2005-09-24 19:22
20年会员
UID 42793
状态 离线
我的疑问都解决了 谢谢大家!

以及感谢 无奈何 大哥提供的晦涩难读的代码 ^_^ 我发现了许多我没注意到的用法
7 发表于 2005-12-02 12:42 ·  中国 山西 太原 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
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:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
8 发表于 2005-12-04 11:32 ·  中国 安徽 芜湖 电信
高级用户
★★★
积分 866
发帖 415
注册 2005-12-04 11:19
20年会员
UID 46459
状态 离线
DOS的批处理用到如此境界,在下真是佩服。
9 发表于 2005-12-05 13:44 ·  中国 北京 顺义区 联通
银牌会员
★★★
DOS联盟捡破烂的
积分 1,144
发帖 425
注册 2005-10-20 00:00
20年会员
UID 43784
来自 北京
状态 离线
(set t=abc)&echo %t%
楼主真逗,你那样当然不成了,别忘了  set后面是空格哈,当然这条不运行了,只运行下面的语句了,你试试上面的就知道了,编写的时候有些不太认真!
10 发表于 2006-11-06 03:21 ·  中国 江苏 南京 电信
高级用户
★★
积分 623
发帖 214
注册 2006-09-22 20:48
19年会员
UID 63387
状态 离线
(set t=abc)&echo %t%也不行,效果和set t=abc&echo %t%一样,都是第二次运行才正确显示,bagpipe兄试验过了吗?

[ Last edited by tianzizhi on 2006-11-6 at 03:22 AM ]
11 发表于 2007-03-17 22:21 ·  中国 上海 黄浦区 电信
初级用户
积分 49
发帖 22
注册 2005-08-04 13:44
20年会员
UID 41332
性别 男
状态 离线
变量延迟效应
12 发表于 2007-03-18 01:35 ·  中国 上海 黄浦区 电信
初级用户
积分 49
发帖 22
注册 2005-08-04 13:44
20年会员
UID 41332
性别 男
状态 离线
强人就是强人
13 发表于 2007-03-18 01:58 ·  中国 广东 广州 电信
中级用户
★★
脚本爱好者
积分 238
发帖 93
注册 2007-03-11 13:38
19年会员
UID 81417
性别 男
来自 GZ
状态 离线
阅读高手们的分析,简直是一种享受!
14 发表于 2007-03-25 23:35 ·  中国 青海 西宁 电信
新手上路
积分 16
发帖 8
注册 2007-03-25 08:59
19年会员
UID 82860
性别 男
状态 离线
set t=abc & call & echo %t%

这样就可以了嘛!
15 发表于 2007-03-28 00:39 ·  IANA 局域网IP(Private-Use)
初级用户
★★
积分 186
发帖 92
注册 2007-03-27 08:20
19年会员
UID 83047
性别 男
状态 离线
楼上还是不行的,要在前面加变量延迟命令的

@echo off&setlocal EnableDelayedExpansion
set t=abc&echo !t!
pause
论坛跳转: