中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 变量扩展的问题(延迟扩展) 上一主题 | 下一主题
spectereye
新手上路





积分 7
发帖 7
注册 2009-2-24
状态 离线
『楼 主』:  变量扩展的问题(延迟扩展)

@echo off&setlocal EnableDelayedExpansion
set a1=1
set a2=2
set a3=3
for %%i in (1,2,3) do (
set b=%%i
echo !b!
echo !a1!
@echo !a%b%!
)
pause

请教高手为什么@echo !a&b%!没输出?

[ Last edited by spectereye on 2009-2-27 at 06:09 ]

2009-2-26 11:45
查看资料  发短消息 网志   编辑帖子  回复  引用回复
spectereye
新手上路





积分 7
发帖 7
注册 2009-2-24
状态 离线
『第 2 楼』:  谢谢

不过还是不太明白
我的原意是想 用for输出a1, a2, a3, 不知道应该怎样改?

好像echo !a%b%!单独输出可以, 放到for里面%b%的值就不会从1变到3了, 应该怎么写?

2009-2-27 05:27
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zhengqian529
初级用户





积分 100
发帖 93
注册 2009-1-14
来自 湖南
状态 离线
『第 3 楼』:  

a!b! 得到的值为 a1 a2 a3,这并不是在先前设置的变量a1, a2, a3, 所以中间过程必须有个转化。

[ Last edited by zhengqian529 on 2009-2-27 at 05:54 ]

2009-2-27 05:30
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (250988158)  编辑帖子  回复  引用回复
spectereye
新手上路





积分 7
发帖 7
注册 2009-2-24
状态 离线
『第 4 楼』:  ???

什么转化?
我的原意是想 用for输出a1, a2, a3, 不知道应该怎样改?
能否直接给出代码?

2009-2-27 06:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zhengqian529
初级用户





积分 100
发帖 93
注册 2009-1-14
来自 湖南
状态 离线
『第 5 楼』:  

for %%i in (1,2,3) do echo a%%i
不知道你是不是这个意思。

2009-2-27 06:36
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (250988158)  编辑帖子  回复  引用回复
wxcute
中级用户





积分 458
发帖 211
注册 2006-7-26
状态 离线
『第 6 楼』:  

不知是 @echo !a%b%! 还是 @echo !a&b%!
若是前者。

既然前面使用了 @echo off,就不必再用 @ 了。

方案一、call echo %%a!b!%%
方案二、echo !a%%i!
方案三、调用标签的CALL

   此帖被 +2 点积分    点击查看详情   
评分人:【 newxso 分数: +2  时间:2009-2-27 09:03




┌───────┐
├→学习→实践→┤
└───────┘
2009-2-27 08:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by spectereye at 2009-2-27 03:27:
不过还是不太明白
我的原意是想 用for输出a1, a2, a3, 不知道应该怎样改?

好像echo !a%b%!单独输出可以, 放到for里面%b%的值就不会从1变到3了, 应该怎么写?

for 内的( echo !a%b%! )中的%b%的值,是在执行for前的值,也就是dos在取for 命令行时已经扩展了整个for内带%号的变量,所以for 内的 set b=%%a,
对echo !a%b%!中的%b%不会产生影响。
如果要取到set b=%%a后,%b%的值,只有使dos读取for命令行时,暂时不扩展,到echo !a%b%!时才扩展,结果才正确。

怎样做到呢?
dos读取命令行后有一特点就是会扩展带%号的变量,但是对连续的%%号,会每两个%合成一个%,所以:把echo !a%b%!,改成:echo !a%%b%%!,
怎么结果还是不对呢?
加个call 在前面,相当于外部调用:
call echo.!a%%b%%!
还是不对!
原来!!虽然可以延迟,但在call命令行时已经扩展了,即a%b%视为常规字符串了,看来只有这样:
call echo.%%a!b!%%
或call call echo.%%%%a%%b%%%%%%
才能得到正确的结果。

[ Last edited by netbenton on 2009-2-28 at 21:38 ]



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-2-27 08:34
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
spectereye
新手上路





积分 7
发帖 7
注册 2009-2-24
状态 离线
『第 8 楼』:  谢谢大家

感谢大家热心解惑
特别感谢6楼, 答案正解, 加分加的好! 非常感谢!
原来用了setlocal enabledelayedexpansion有时还需要call来实现延时扩展啊
另外 方案三 调用call是不是为了跳出for循环? 避免for循环引起的延时扩展的麻烦?

ps: 七楼说的变量扩展原理偶没明白...不过所说的echo !a%%b%%!好像得不到想要的结果...

[ Last edited by spectereye on 2009-2-27 at 11:51 ]

2009-2-27 11:46
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: