Board logo

标题: 学习变量的嵌套截取 [打印本页]

作者: ygrzzz     时间: 2008-9-24 23:40    标题: 学习变量的嵌套截取

新手没什么可写的 ,比较基础的东西~~~
今天学习变量的嵌套截取,写了 一个批处理,如下
一。
@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 ]
作者: HAT     时间: 2008-9-24 23:45
感谢分享,但最后那段比喻着实不咋地,严重影响整篇文章的质量,建议删除。

  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


作者: ygrzzz     时间: 2008-9-25 01:43
的确在上面几个帖子里受到的不少启发,于是有了这帖学习过程的体会
感谢前辈们的热心点拨