中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 关于变量引用的问题 上一主题 | 下一主题
#four#
中级用户




积分 209
发帖 34
注册 2004-5-25
状态 离线
『楼 主』:  关于变量引用的问题

我在学习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也不能正确显示,而下面那句却能正常显示第一个字符。
百思不得其解.望高手解答.

2006-11-21 04:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 2 楼』:  

  这个属于变量的延迟问题,改成如下代码就可以了:
@echo off
setlocal enabledelayedexpansion
set num=iamyxj
set a=0
set /a a+=1
echo !num:~%a%,1!
echo %num:~1,1%
pause
  更多的信息请参考:什么情况下该使用变量延迟?



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-11-21 04:47
查看资料  发短消息 网志   编辑帖子  回复  引用回复
#four#
中级用户




积分 209
发帖 34
注册 2004-5-25
状态 离线
『第 3 楼』:  

我看了关于变量延迟的文章,willsort兄是这样说的。
     命令解释器是扩展环境变量的行为大致如下:首先读取命令行的一条完整语句,在进行一些先期的预处理之后,命令被解释执行之前,会对其中用百分号闭合的字符串进行匹配,如果在环境空间中找到了与字符串相匹配的环境变量,则用其值替换掉原字符串及百分号本身,如果未得到匹配,则用一个空串替换,这个过程就是环境变量的“扩展”,它仍然属于命令行的预处理范畴。
  而我上面的那个批处理不是一条语句啊,我先对变量nul和a进行了设置,再读到下一句的时候应该能从环境空间中找到这个变量吗。为什么也要用上!号来延迟引用这个变量呢。
版主能不能对我们这样的新手再举几个例子说一说呢。

2006-11-21 05:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 4 楼』:  





三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2006-11-21 05:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tao0610
高级用户

朦胧的世界


积分 579
发帖 218
注册 2006-10-24
状态 离线
『第 5 楼』:  



  Quote:
echo %num:~%a%,1%

会对其中用百分号闭合的字符串进行匹配
这句会把前两个%%中间的做匹配,也就是%num:~%被先匹配!




认识自己,降伏自己,改变自己
,才能改变别人!
2006-11-21 05:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 6 楼』:  

因为你使用了变量套变量,所以必须使用!,而使用!就必须起用延迟变量。



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-11-21 05:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
9527
银牌会员

努力做坏人


积分 1185
发帖 438
注册 2006-8-28
来自 北京
状态 离线
『第 7 楼』:  

其实除了二楼NAMEJM兄的方法,也可以使用内部命令CALL

@echo off
set num=iamyxj
set a=0
set /a a+=1
call echo %%num:~%a%,1%%  这样的形式就可以啦
echo %num:~1,1%
pause

   此帖被 +5 点积分     点击查看详情   
评分人:【 不得不爱 分数: +5  时间:2006-11-21 23:02




我今后在论坛的目标就是做个超级坏人!!!
2006-11-21 05:21
查看资料  发短消息 网志  OICQ (329429)  编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 8 楼』:  

楼上的是一样无法使用



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-11-21 05:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
9527
银牌会员

努力做坏人


积分 1185
发帖 438
注册 2006-8-28
来自 北京
状态 离线
『第 9 楼』:  

我想楼上的还是先问问其他人的测试结果在说吧



我今后在论坛的目标就是做个超级坏人!!!
2006-11-21 06:20
查看资料  发短消息 网志  OICQ (329429)  编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 10 楼』:  


  经测试,9527 兄在7楼的代码是正确的,得到了正确的结果。
  
  call用的妙~学习了~


2006-11-21 14:25
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tao0610
高级用户

朦胧的世界


积分 579
发帖 218
注册 2006-10-24
状态 离线
『第 11 楼』:  


@echo on&setlocal enabledelayedexpansion
set num=iamyxj
set a=12345
set b=0
set /a b+=1
call echo %%num:~!a:~%b%,1!,1%%
echo %num:~1,1%
pause
两者都用上的能套用2次变量。

   此帖被 +2 点积分    点击查看详情   
评分人:【 namejm 分数: +2  时间:2006-11-21 22:45





认识自己,降伏自己,改变自己
,才能改变别人!
2006-11-21 14:58
查看资料  发短消息 网志   编辑帖子  回复  引用回复
amao
中级用户





积分 316
发帖 152
注册 2006-6-18
状态 离线
『第 12 楼』:  

刚刚开始学CMD下的批处理,收下来备用。

2006-11-21 19:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 13 楼』:  多个变量相互嵌套测试,版本:晕晕版~:)

多个变量相互嵌套测试实验,版本:晕晕版~:)
@echo off
cls

set num=Redtek 2006 bbs.cn-dos.net
set a=12345
set b=654321

echo ● 变量测试:
echo.
echo ● 想取 ^%num:~5,1^% ,即:从偏移量5开始取变量num的值,取1个字符,结果:k
echo   根据上面原理,在不使用延时变量的情况下测试变量嵌套变量取值。
echo.
echo ● 现在我们设^%num:~5,1^%这里面的~5要求间接来自另一个变量b。
echo   所以,^%num:~5,1^%应(伪代码)表示为:^%num:~b,1^%,但变量b内有多个值,
echo   我们只想取变量b内的从偏移量0起的第1个元素,就是5。已经开始嵌套变量了。
echo   所以我们还要在num的变量取值计算语句中再嵌套进取变量b(^%b:~1,1^%)的语句。
echo.
echo   即:取变量num中的某个字符要由另一个变量b来决定从哪里开始取。
echo     但是,我们还要让它再嵌套变量,即:
echo     决定取num变量中的哪一个字符由变量b中某个字符值决定,所以还要再分解b,
echo     这样,就是三层嵌套变量的关系,它们层层相互影响并嵌套变量着,哈哈……
echo.
echo ● 所以,我们使用了多级测试显示取值的整个过程的演化~:)
echo.
echo   下面结果是四条“渐近”求值的过程,最后连Call了3次才求出这些被嵌套的变量:)
echo.

echo   %%%%%%%%num:~%%%%b:~%a:~0,1%,1%%%%,1%%%%%%%%

call echo   %%%%%%%%num:~%%%%b:~%a:~0,1%,1%%%%,1%%%%%%%%

call call echo   %%%%%%%%num:~%%%%b:~%a:~0,1%,1%%%%,1%%%%%%%%

call call call echo   最后值为:%%%%%%%%num:~%%%%b:~%a:~0,1%,1%%%%,1%%%%%%%%


rem  理论上,我们可以Call它n多次,这样我们可以随便在变量中再嵌套变量:)
rem  以上是一个对嵌套变量实现更深了解的“晕晕”的实验过程~:)
测试输出的值的结果如下:
  %%%%num:~%%b:~1,1%%,1%%%%
  %%num:~%b:~1,1%,1%%
  %num:~5,1%
  最后值为:k
以上实验变量嵌套需要 4 次“动作”才能完全“转化”并显示实际希望值:)

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

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

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

[ Last edited by redtek on 2006-11-21 at 09:53 AM ]

   此帖被 +2 点积分    点击查看详情   
评分人:【 namejm 分数: +2  时间:2006-11-21 22:55




    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-11-21 22:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 14 楼』:  

经测试,9527 兄在7楼的代码是正确的,得到了正确的结果。
加5分



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-11-21 23:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: