找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 29399|回复: 11

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

[复制链接]
发表于 2013-4-14 19:35:49 | 显示全部楼层 |阅读模式
本帖最后由 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]

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2013-4-14 20:07:05 | 显示全部楼层
把echo !!a!!改为echo !%a%!
 楼主| 发表于 2013-4-14 21:07:34 | 显示全部楼层
回复 2# tz_being


    ECHO 处于关闭状态。
还是不行
发表于 2013-4-14 21:36:47 | 显示全部楼层
请测试如下代码:

  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
复制代码
 楼主| 发表于 2013-4-15 16:05:00 | 显示全部楼层
本帖最后由 522235677 于 2013-4-18 19:56 编辑

发表于 2013-4-15 18:07:34 | 显示全部楼层
echo !%a%!
改为:
call echo %%!a!%%

评分

参与人数 1技术 +1 收起 理由
522235677 + 1 技术

查看全部评分

 楼主| 发表于 2013-4-15 19:33:34 | 显示全部楼层
本帖最后由 522235677 于 2013-4-15 19:35 编辑

回复 6# xxpinqz


thanks,这个为什么要用call呢,可以解释解释吗
发表于 2013-4-15 21:58:52 | 显示全部楼层
假设 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。
发表于 2013-4-16 00:23:21 | 显示全部楼层
本帖最后由 terse 于 2013-4-16 14:35 编辑

这样处理效率稍提点
  1. for %%e in (c!choice!) do echo !%%e!
复制代码
 楼主| 发表于 2013-4-16 14:17:34 | 显示全部楼层
回复 8# wankoilz


    灰常感谢,恍然大悟啊
发表于 2013-4-16 18:48:22 | 显示全部楼层
回复 7# 522235677

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

具体经过验证的原理,你得去请教下论坛上的几位大佬了。我只知道用法,不知道原理~~~~~
 楼主| 发表于 2013-4-16 22:12:53 | 显示全部楼层
回复 11# xxpinqz


    碉堡,感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 04:55 , Processed in 0.021492 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表