[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[分享]从一个有趣的结果来谈谈批处理变量嵌套

请大家先运行下面的批,然后带着疑问和我一起来学习下变量嵌套:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1,1,5) do set "str%%a=%%a"&!set "str=!str! ^!str%%a^!"
  3. echo %str%
  4. echo !str!
  5. 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变量所组成的集
合,而这个集合中的变量只有在!变量符触发变量延迟的情况下,其值才会被解
析出来。
    好了,今天就讲这么多了,下面就再给大家一个变量嵌套的例子,帮助大家
好好理解所讲到的内容:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1,1,3) do (  
  3.     if not defined str1 set "str=!str!^!str1^!"  
  4.     set "str1=%%a"
  5.     for /l %%a in (1,1,3) do (
  6.         if not defined str2 set "str=!str!^!str2^!"  
  7.         set "str2=%%a"
  8.         for /l %%a in (1,1,3) do (
  9.             if not defined str3 set "str=!str!^!str3^!"  
  10.             set "str3=%%a"
  11.             for %%a in (!str!) do echo %%a
  12.         )
  13.     )
  14. )
  15. pause>nul
复制代码

[ 本帖最后由 batman 于 2009-11-14 01:22 编辑 ]
3

评分人数

    • qq506657335: 赞一个。。PB + 5
    • firewolf85: 正准备询问着方面的问题,就看到斑竹的帖子 ...PB + 2 技术 + 1 + 1
    • Seter: 很好。赞一个。PB + 10
***共同提高***

返回列表