![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-11 11:33 |
共 47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 变量扩展的问题(延迟扩展) |
| 可打印版本 781 / 7 |
| 第1楼 spectereye | 发表于 2009-02-26 11:45 |
| 新手上路 发帖 7 积分 7 | |
|
变量扩展的问题(延迟扩展) @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 ] |
|
| 第2楼 spectereye | 发表于 2009-02-27 05:27 |
| 新手上路 发帖 7 积分 7 | |
|
谢谢 不过还是不太明白
我的原意是想 用for输出a1, a2, a3, 不知道应该怎样改? 好像echo !a%b%!单独输出可以, 放到for里面%b%的值就不会从1变到3了, 应该怎么写? |
|
| 第3楼 zhengqian529 | 发表于 2009-02-27 05:30 |
| 初级用户 发帖 93 积分 100 来自 湖南 | |
|
a!b! 得到的值为 a1 a2 a3,这并不是在先前设置的变量a1, a2, a3, 所以中间过程必须有个转化。
[ Last edited by zhengqian529 on 2009-2-27 at 05:54 ] |
|
| 第4楼 spectereye | 发表于 2009-02-27 06:08 |
| 新手上路 发帖 7 积分 7 | |
|
??? 什么转化?
我的原意是想 用for输出a1, a2, a3, 不知道应该怎样改? 能否直接给出代码? |
|
| 第5楼 zhengqian529 | 发表于 2009-02-27 06:36 |
| 初级用户 发帖 93 积分 100 来自 湖南 | |
|
for %%i in (1,2,3) do echo a%%i
不知道你是不是这个意思。 |
|
| 第6楼 wxcute | 发表于 2009-02-27 08:22 |
| 中级用户 发帖 211 积分 458 | |
|
不知是 @echo !a%b%! 还是 @echo !a&b%!
若是前者。 既然前面使用了 @echo off,就不必再用 @ 了。 方案一、call echo %%a!b!%% 方案二、echo !a%%i! 方案三、调用标签的CALL |
|
| 第7楼 netbenton | 发表于 2009-02-27 08:34 |
| 银牌会员 发帖 752 积分 1,916 来自 广西 | |
Originally posted by spectereye at 2009-2-27 03:27: 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 ] |
|
| 第8楼 spectereye | 发表于 2009-02-27 11:46 |
| 新手上路 发帖 7 积分 7 | |
|
谢谢大家 感谢大家热心解惑
特别感谢6楼, 答案正解, 加分加的好! 非常感谢! 原来用了setlocal enabledelayedexpansion有时还需要call来实现延时扩展啊 另外 方案三 调用call是不是为了跳出for循环? 避免for循环引起的延时扩展的麻烦? ps: 七楼说的变量扩展原理偶没明白...不过所说的echo !a%%b%%!好像得不到想要的结果... [ Last edited by spectereye on 2009-2-27 at 11:51 ] |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |