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

[文本处理] [已解决]批处理如何设置变量中的变量?

本帖最后由 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]
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 11# xxpinqz


    碉堡,感谢

TOP

回复 7# 522235677

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

具体经过验证的原理,你得去请教下论坛上的几位大佬了。我只知道用法,不知道原理~~~~~

TOP

回复 8# wankoilz


    灰常感谢,恍然大悟啊

TOP

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

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

TOP

假设 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。

TOP

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

回复 6# xxpinqz


thanks,这个为什么要用call呢,可以解释解释吗

TOP

echo !%a%!
改为:
call echo %%!a!%%
1

评分人数

TOP

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

TOP

请测试如下代码:
  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
复制代码

TOP

回复 2# tz_being


    ECHO 处于关闭状态。
还是不行

TOP

把echo !!a!!改为echo !%a%!

TOP

返回列表