中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]如何解决变量嵌变量的问题
作者:
标题: [求助]如何解决变量嵌变量的问题 上一主题 | 下一主题
junyee
中级用户




积分 253
发帖 112
注册 2006-5-31
状态 离线
『楼 主』:  [求助]如何解决变量嵌变量的问题



--------------------
set a=1
set b1=Test
echo %b%a%%
--------------------

如何解决一个变量里面再嵌入一个变量的问题呢??


谢谢!

[ Last edited by junyee on 2009-12-21 at 15:24 ]

2009-12-21 15:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 2 楼』:  

1.call echo %%b%a%%%

2.启动变量延时
   echo !b%a%!



S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
2009-12-21 16:22
查看资料  发短消息 网志   编辑帖子  回复  引用回复
junyee
中级用户




积分 253
发帖 112
注册 2006-5-31
状态 离线
『第 3 楼』:  

谢谢楼上的,我给的是例子,但是实际上不能完成我想要达到的目的,

如下

------------------------
set my=04050608070309121113101415
----------------------------
我想把这个%my%分解成两位一组的变量,A1~A13,且%A1%<%A2%<%A3%<...%A13%
我想用了一个笨办法,把%my%以两个字符为单位,逐行追加到一个文本tst.txt中,再用sort把tst.txt重新分组,再用

FOR命令处理文档tst.txt,以行为单位,分别赋值给A1~A13.


::--------BEGIN---------------
set my=04050608070309121113101415
setlocal enabledelayedexpansion
del /f /q %temp%\tst.txt
for /l %%i in (0,2,26) do (
        set T=%%i
        set /a HalfA=%%i/2
        call echo !my:~!T!,2!>>%temp%\tst.txt
)

set T=1
set HalfA=

for /f %%i in ('sort %temp%\tst.txt') do (
        set A%T%=%%i
        set /a T+=1
)
echo %A1% %A2% %A3% %A4% %A5% %A6% %A7% %A8% %A9% %A10% %A11% %A12% %A13%
PAUSE
::----------END--------------


测试失败,我知道有好多地方错了,但是说不出原由。。。
热心的朋友帮忙修改一下,或给一个更好的方法了,最好能不用sort转这么大个弯子。

2009-12-21 17:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 4 楼』:  

对于你写的批处理:
1,for /l %%i in (0,2,26) do ( 变量的长度应该是未知的,而却终止值应该使24
2,set /a HalfA=%%i/2下面没有用到HalfA变量,所以看不出他存在的意义
3,call echo !my:~!T!,2!>>%temp%\tst.txt这个直接写成>>%temp% echo !my:~%%i,2!就可以。从语法上讲,!my:~!T!,2!是错误的。
所以,set T=%%i就显得多余了。
所以,set T=1和set HalfA=也没有必要
4,set A%T%=%%i
set /a T+=1
对于这段,应该先使用set /a T+=1,这样变量T为从1开始的数列,即1,2,3,4。。。。。。
set A%T%=%%i,对于这个应放在set /a T+=1的后面,对于for 内部使用扩展T这个在for内部变化的变量,应该使用变量延迟,即!T!
5,应该在最后面使用del,而不是在开始。
6,在这个批处理中,显然sort要比其他的方法快,为什么 反而不用呢?
::--------BEGIN---------------
set my=04050608070309121113101415
setlocal enabledelayedexpansion
for /l %%i in (0,2,24) do >>%temp%\tst.txt echo !my:~%%i,2!
for /f %%i in ('sort %temp%\tst.txt') do set /a T+=1&set A!T!=%%i
echo %A1% %A2% %A3% %A4% %A5% %A6% %A7% %A8% %A9% %A10% %A11% %A12% %A13%
del /f /q %temp%\tst.txt
PAUSE
::----------END--------------
[ Last edited by Hanyeguxing on 2009-12-21 at 22:08 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2009-12-21 18:37
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 5 楼』:  

以你提供的数组为例,不存在重复的数组,数组均为2位,如果不想使用临时文件,不使用 sort ,可以这样写:
@echo off &setlocal enabledelayedexpansion
set my=04050608070309121113101415
:Hanye::计算变量的长度
if not "!my:~%n%,1!"=="" set /a n+=1 &goto Hanye
set /a n=%n%-2
for /l %%i in (0 2 %n%) do set A_!my:~%%i,2!=Hanyeguxing
for /f "tokens=2 delims==_" %%i in ('set ^| find "A_"') do set /p=%%i <NUL
echo.&pause
[ Last edited by Hanyeguxing on 2009-12-21 at 23:29 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2009-12-21 22:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 6 楼』:  

批处理中的变量延迟扩展、变量嵌套
http://bbs.bathome.cn/thread-2899-1-1.html



2009-12-22 00:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
junyee
中级用户




积分 253
发帖 112
注册 2006-5-31
状态 离线
『第 7 楼』:  

版主能不能把链接的内容大致描述一下》》???
MS现在很多论坛都被伟大的柱国给 禾口`言皆`了。
bathome.cn已经打不开了。

2009-12-30 00:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pdanniel66
初级用户





积分 68
发帖 64
注册 2009-5-23
状态 离线
『第 8 楼』:  

可以使用google的库存档案试试看!

2009-12-30 05:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pdanniel66
初级用户





积分 68
发帖 64
注册 2009-5-23
状态 离线
『第 9 楼』:  

批处理中的变量延迟扩展、变量嵌套

【教程汇总】批处理中的变量延迟扩展、变量嵌套
引用:
参考《for语句从入门到精通》中关于变量延迟扩展的讲解
http://bbs.bathome.cn/thread-2189-1-1.html
引用:
什么是延迟环境变量扩展?
http://bbs.bathome.cn/thread-3083-1-1.html
引用:
变量延迟详解
http://bbs.bathome.cn/thread-2898-1-1.html
引用:
什么情况下该使用变量延迟
原文地址:http://www.cn-dos.net/forum/viewthread.php?tid=20733
引用:
      关于环境变量延迟扩展,使用set /?可以查看到部分说明,不过考虑到其粗劣的翻译水平,建议在查看之前,首先chcp 437切换为英文查看原英文说明。鉴于文中已说得十分详尽,而且有数个代码示例,应该不难理解。在此仅略作一些补充。

      在许多可见的官方文档中,均将使用一对百分号闭合环境变量以完成对其值的替换行为称之为“扩展(expansion)”,这其实是一个第一方的概念,是从命令解释器的角度进行称谓的,而从我们使用者的角度来看,则可以将它看作是引用(Reference)、调用(Call)或者获取(Get)。

      而命令解释器是扩展环境变量的行为大致如下:首先读取命令行的一条完整语句,在进行一些先期的预处理之后,命令被解释执行之前,会对其中用百分号闭合的字符串进行匹配,如果在环境空间中找到了与字符串相匹配的环境变量,则用其值替换掉原字符串及百分号本身,如果未得到匹配,则用一个空串替换,这个过程就是环境变量的“扩展”,它仍然属于命令行的预处理范畴。

      而一条“完整的语句”,在NT的命令解释器CMD中被解释为“for if else”等含有语句块的语句和用“& | && ||”等连接起来的复合语句。

      因此,当CMD读取for语句时,其后用一对圆扩号闭合的所有语句将一同读取,并完成必要的预处理工作,这其中就包括环境变量的扩展,所以在for中的所有语句执行之前,所有的环境变量都已经被替换为for之前所设定的值,从而成为一个字符串常量,而不再是变量。无论在for中将那些环境变量如何修改,真正受到影响的只是环境变量空间,而非for语句内部。
      
      而为了能够在for语句内部感知环境变量的动态变化,CMD设计了延迟的环境变量扩展特性,也就是说,当CMD读取了一条完整的语句之后,它不会立即执行变量的扩展行为,而会在某个单条语句执行之前再进行扩展,也就是说,这个扩展行为被“延迟”了。

      延迟环境变量扩展特性在CMD中缺省是关闭的,开启它的方法目前有两个:一是CMD /v:off(此处说法有误,应为 CMD /v:on——namejm 注),它会打开一个新的命令行外壳,在使用exit退出这个外壳之前,扩展特性始终有效,常用于命令行环境中;二是setlocal EnableDelayedExpansion,它会使环境变量的修改限制到局部空间中,在endlocal之后,扩展特性和之前对环境变量的修改将一同消失,常用于批处理语句中

2009-12-30 05:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: