Board logo

标题: [文本处理] [已解决]批处理如何设置变量中的变量? [打印本页]

作者: 522235677    时间: 2013-4-14 19:35     标题: [已解决]批处理如何设置变量中的变量?

本帖最后由 522235677 于 2013-4-15 21:07 编辑

利用for的处理,得出c1的值是[000-1F1] 还有c2的值是[23F-GF3] 还有c3 c4 .....
相当于这样c1=[000-1F1]
echo !c1!
这个也能正常的显示[000-1F1]

下面是N行后的批处理
  set choice=
   set /p choice=选择类型:
echo !choice!               这个choice的值只会是数字,不会是别的,假如现在这个choice的值是1
set a=c!choice!            这个a的值现在应该是c1
echo !!a!!                   问题就在这里了,不知道这里到底要怎么写,目的就是要这样显示出[000-1F1]
作者: tz_being    时间: 2013-4-14 20:07

把echo !!a!!改为echo !%a%!
作者: 522235677    时间: 2013-4-14 21:07

回复 2# tz_being


    ECHO 处于关闭状态。
还是不行
作者: tz_being    时间: 2013-4-14 21:36

请测试如下代码:
  1. @echo off && setlocal enabledelayedexpansion
  2. set "c1=[000-1F1]"
  3. set choice=1
  4. echo !choice!
  5. set a=c!choice!
  6. echo !%a%!
  7. pause>nul
复制代码

作者: 522235677    时间: 2013-4-15 16:05

本帖最后由 522235677 于 2013-4-18 19:56 编辑


作者: xxpinqz    时间: 2013-4-15 18:07

echo !%a%!
改为:
call echo %%!a!%%
作者: 522235677    时间: 2013-4-15 19:33

本帖最后由 522235677 于 2013-4-15 19:35 编辑

回复 6# xxpinqz


thanks,这个为什么要用call呢,可以解释解释吗
作者: wankoilz    时间: 2013-4-15 21:58

假设 a=b   b=c
变量嵌套的实现都源于“多次扩展”,比如echo !%a%!,在echo 执行之前,先扩展出%a%的值b,再扩展出!b!的值c,再执行echo。
而call echo %%!a!%%原理是:在call echo执行之前%%!a!%%先被扩展为%!a!%,再扩展出!a!的值b,称为%b%,这个所谓“预处理”的过程结束之后就开始执行 call echo ,call会引起再次的“预处理”(原理我忘了)这样%b%被再次扩展,得到c。
作者: terse    时间: 2013-4-16 00:23

本帖最后由 terse 于 2013-4-16 14:35 编辑

这样处理效率稍提点
  1. for %%e in (c!choice!) do echo !%%e!
复制代码

作者: 522235677    时间: 2013-4-16 14:17

回复 8# wankoilz


    灰常感谢,恍然大悟啊
作者: xxpinqz    时间: 2013-4-16 18:48

回复 7# 522235677

    具体原理我也讲不上来。依稀记得以前有人举过这么一个例子,大概是这么个意思(换衣服):给A穿上衣服称之为!a!,然后我要换一件衣服,要换先得脱,这时称为%!a!%,然后才穿上新衣服,称为%%!a!%%.这个意思能看懂吧?
这时变量已经是定义完成了,但在复合语句中要使用,就必须要经过某个语句或过程来再次扩展(为什么?这原理也不清楚),这样的语句如
call echo ,
或者9楼的for,
或者用管道符,如:echo |echo %%!a!%%,
或者call :mmm !a!
:mmm
set dd=%1
echo !%dd%!
goto :eof

具体经过验证的原理,你得去请教下论坛上的几位大佬了。我只知道用法,不知道原理~~~~~
作者: 522235677    时间: 2013-4-16 22:12

回复 11# xxpinqz


    碉堡,感谢




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2