请大家先运行下面的批,然后带着疑问和我一起来学习下变量嵌套:- @echo off&setlocal enabledelayedexpansion
- for /l %%a in (1,1,5) do set "str%%a=%%a"&!set "str=!str! ^!str%%a^!"
- echo %str%
- echo !str!
- pause>nul
复制代码 为什么会这样?肯定很多人已经产生了这样的疑问。按照平常我们对变量
理解,%str%和!str!出来的结果应该是一样的,因为同是str变量,唯一的只
是存在着变量符%和!的区别嘛。呵呵,大家可别小看了这个变量符的变化了,
这里面可是大有文章的哦。。。
我们先来分析下这段代码,第一句不用多说是关回显开变量延迟,第二句
中就存在着技术成分了,利用for循环依次赋值给变量,在这其中每次对两个变
量进行了赋值,以%%a值为1时为例:set "str1=1"将变量str1的值定义为1,而
set "str=!str! ^!str%%a^!",大家特别要注意^!,利用^将!转义为如同a b c
一样的字符,解析出来就是set "str= !str1!"(初始时str值为空,!为字符),
这样当%%a值为 2时,str2变量的值被定义为2,而str的值变成了 !str1! !str2!
,最后当%%a值为5时,str5变量的值被定义为5,str的值因为五次的累加赋值变
成了 !str1! !str2! !str3! !str4! !str5!,整个for循环结束。
于是当我们echo !str!时,这时str变量的变量符!触发变量延迟作用,cmd进行
预处理,解析出其值是个变量集合,经过预处理后,cmd不会再进一步解析其
值中每对!!间的变量了,而当我们echo %str%时,变量str的值首先被解析出
来,这时其值中的!触发了变量延迟,cmd进一步对值中每对!!中的变量进行解
析,于是输出了最终的结果 1 2 3 4 5。
我们再回过头来看一下这到底是怎么一个概念?其实这就是变量嵌套,代码中
的str变量实际上是一个表达式,它代表的是一个由str1到str5变量所组成的集
合,而这个集合中的变量只有在!变量符触发变量延迟的情况下,其值才会被解
析出来。
好了,今天就讲这么多了,下面就再给大家一个变量嵌套的例子,帮助大家
好好理解所讲到的内容:- @echo off&setlocal enabledelayedexpansion
- for /l %%a in (1,1,3) do (
- if not defined str1 set "str=!str!^!str1^!"
- set "str1=%%a"
- for /l %%a in (1,1,3) do (
- if not defined str2 set "str=!str!^!str2^!"
- set "str2=%%a"
- for /l %%a in (1,1,3) do (
- if not defined str3 set "str=!str!^!str3^!"
- set "str3=%%a"
- for %%a in (!str!) do echo %%a
- )
- )
- )
- pause>nul
复制代码
[ 本帖最后由 batman 于 2009-11-14 01:22 编辑 ] |