|
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
状态 离线
|
|
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 |
|