中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-02 12:50
48,038 主题排行 / 350,123 发帖 / 今日 1 篇 / 48,251 会员排行
DOS批处理 & 脚本技术(批处理室) » 关于变量引用的问题
可打印版本  1,777 / 13
第1楼 #four# 发表于 2006-11-21 04:36
中级用户 发帖 34 积分 209
关于变量引用的问题
我在学习set命令的时候,用了下面这段批处理想测试一下变量引用的问题,可是结果却不能下确显示,求高手能帮我解答。
批处理是如下
@echo off
set num=iamyxj
set a=0
set /a a+=1
echo %num:~%a%,1%
echo %num:~1,1%
pause

我想通过对变量a的引用来显示变量num的任意一个字符,发现不能解析变量%a%,就连我把变量直接设成1也不能正确显示,而下面那句却能正常显示第一个字符。
百思不得其解.望高手解答.
第2楼 namejm 发表于 2006-11-21 04:47
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  这个属于变量的延迟问题,改成如下代码就可以了:

  更多的信息请参考:什么情况下该使用变量延迟?
第3楼 #four# 发表于 2006-11-21 05:00
中级用户 发帖 34 积分 209
我看了关于变量延迟的文章,willsort兄是这样说的。
命令解释器是扩展环境变量的行为大致如下:首先读取命令行的一条完整语句,在进行一些先期的预处理之后,命令被解释执行之前,会对其中用百分号闭合的字符串进行匹配,如果在环境空间中找到了与字符串相匹配的环境变量,则用其值替换掉原字符串及百分号本身,如果未得到匹配,则用一个空串替换,这个过程就是环境变量的“扩展”,它仍然属于命令行的预处理范畴。
而我上面的那个批处理不是一条语句啊,我先对变量nul和a进行了设置,再读到下一句的时候应该能从环境空间中找到这个变量吗。为什么也要用上!号来延迟引用这个变量呢。
版主能不能对我们这样的新手再举几个例子说一说呢。
第4楼 ccwan 发表于 2006-11-21 05:04
金牌会员 发帖 1,160 积分 2,725 来自 河北廊坊
第5楼 tao0610 发表于 2006-11-21 05:14
高级用户 发帖 218 积分 579

echo %num:~%a%,1%


会对其中用百分号闭合的字符串进行匹配
这句会把前两个%%中间的做匹配,也就是%num:~%被先匹配!
第6楼 不得不爱 发表于 2006-11-21 05:18
超级版主 发帖 2,044 积分 5,310 来自 四川南充
因为你使用了变量套变量,所以必须使用!,而使用!就必须起用延迟变量。
第7楼 9527 发表于 2006-11-21 05:21
银牌会员 发帖 438 积分 1,185 来自 北京
其实除了二楼NAMEJM兄的方法,也可以使用内部命令CALL

@echo off
set num=iamyxj
set a=0
set /a a+=1
call echo %%num:~%a%,1%% 这样的形式就可以啦
echo %num:~1,1%
pause
第8楼 不得不爱 发表于 2006-11-21 05:53
超级版主 发帖 2,044 积分 5,310 来自 四川南充
楼上的是一样无法使用
第9楼 9527 发表于 2006-11-21 06:20
银牌会员 发帖 438 积分 1,185 来自 北京
我想楼上的还是先问问其他人的测试结果在说吧
第10楼 lxmxn 发表于 2006-11-21 14:25
版主 发帖 4,938 积分 11,386

  经测试,9527 兄在7楼的代码是正确的,得到了正确的结果。
  
  call用的妙~学习了~
第11楼 tao0610 发表于 2006-11-21 14:58
高级用户 发帖 218 积分 579


两者都用上的能套用2次变量。
第12楼 amao 发表于 2006-11-21 19:13
中级用户 发帖 152 积分 316
刚刚开始学CMD下的批处理,收下来备用。
第13楼 redtek 发表于 2006-11-21 22:42
金牌会员 发帖 1,147 积分 2,902
多个变量相互嵌套测试,版本:晕晕版~:)
多个变量相互嵌套测试实验,版本:晕晕版~:)




测试输出的值的结果如下:


以上实验变量嵌套需要 4 次“动作”才能完全“转化”并显示实际希望值:)

简单的说明原理: 从变量num中取的字符值,由另一个变量b决定,而变量b中某个字符值的取向再由变量a来决定。

规律: %%两个百分号用于输出的话,就代表一个%号,
    如果想输出%%两个百分号,就要用4个百分号。
    利用上面原理,使用%百分号的不同的数量来决定变量嵌套的级数,
    级数越多,百分号的双倍使用数量也随着递增,使用这个原理可以完成极复杂的嵌套。

    缺点:越复杂的嵌套几乎越是无法清晰读懂,同时越难维护代码。
       所以,使用延时变量另一个好处在于可以让代码非常清晰:)  

[ Last edited by redtek on 2006-11-21 at 09:53 AM ]
第14楼 不得不爱 发表于 2006-11-21 23:03
超级版主 发帖 2,044 积分 5,310 来自 四川南充
经测试,9527 兄在7楼的代码是正确的,得到了正确的结果。
加5分
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023