中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 学习变量的嵌套截取 上一主题 | 下一主题
ygrzzz
初级用户





积分 62
发帖 24
注册 2008-9-17
状态 离线
『楼 主』:  学习变量的嵌套截取

新手没什么可写的 ,比较基础的东西~~~
今天学习变量的嵌套截取,写了 一个批处理,如下
一。
@echo off
set a=abcdefg
set e=3
:: set/p e=输入数字。。。
echo %a:~1,%e%%
pause

测试结果显示
e%
估计是把前部分%a:~1,%解释为空值,最后的双百分号脱为单百分号的 结果
二。
改为
echo %a:~1,%%e%% 或 echo %a:~1,%%e%
结果均只显示为e的值3
三。
由此推测cmd解释变量的方式是以成对百分号从左倒右顺序来解释的
如此的 话单纯的 echo是 没法完成目标了,想起以前别人的P处的 for用法中
提到变量延迟问题,继续改
@echo off
SETLOCAL EnableDelayedExpansion
set a=abcdefg
set e=3
echo !a:~1,%e%!
pause

果然正确显示出结果3个字符
bcd
看来正确解释出这个嵌套变量必须由内而外分2层来解释
四。
继续测试call方式
@echo off
set a=abcdefg
set e=3
call echo %a:~1,%e%%
pause
结果显示e
理解为echo %a:~1,%e%%===结果e%
那么call e%结果为e
e前加个%来看看,
call echo %a:~1,%%e%%结果显示3(前面不加call也 显示3)
五。
头尾继续加%,改为
call echo %%a:~1,%%e%%%
结果显示e
于是去掉e前面的%(还原)
call echo %%a:~1,%e%%%
NND总算看见曙光了,再次显示bcd

多余再测试一下,去掉call改为
echo %%a:~1,%e%%%
显示为
%a:~1,3%
再次证明cmd解释变量时把%%化二为一%
从左往右遇到l一对中间有字符的%*%时当变量解释
很显然第一次echo的结果为%a:~1,3%
关于call暂且理解为再次启动一次cmd环境进行解释,于是得到正确结果
....ok~~~~~~~

[ Last edited by ygrzzz on 2008-9-25 at 01:35 AM ]

   此帖被 +8 点积分        点击查看详情   
评分人:【 moniuming 分数: +8  时间:2008-9-25 09:17


2008-9-24 23:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 2 楼』:  

感谢分享,但最后那段比喻着实不咋地,严重影响整篇文章的质量,建议删除。

  Quote:
变量延迟详解
http://www.cn-dos.net/forum/viewthread.php?tid=28273

什么情况下该使用变量延迟
http://www.cn-dos.net/forum/viewthread.php?tid=20733

一个变量嵌套变量的问题
http://www.cn-dos.net/forum/viewthread.php?tid=41143





2008-9-24 23:45
查看资料  发短消息 网志   编辑帖子  回复  引用回复
ygrzzz
初级用户





积分 62
发帖 24
注册 2008-9-17
状态 离线
『第 3 楼』:  

的确在上面几个帖子里受到的不少启发,于是有了这帖学习过程的体会
感谢前辈们的热心点拨

2008-9-25 01:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: