![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-10-01 17:24 |
共 47,813 主题排行 / 349,918 发帖 / 今日 0 篇 / 48,279 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [求助]如何解决变量嵌变量的问题 |
| 可打印版本 1,076 / 8 |
| 第1楼 junyee | 发表于 2009-12-21 15:23 |
| 中级用户 发帖 112 积分 253 | |
|
[求助]如何解决变量嵌变量的问题 如
-------------------- set a=1 set b1=Test echo %b%a%% -------------------- 如何解决一个变量里面再嵌入一个变量的问题呢?? 谢谢! [ Last edited by junyee on 2009-12-21 at 15:24 ] |
|
| 第2楼 slore | 发表于 2009-12-21 16:22 |
| 铂金会员 发帖 2,478 积分 5,212 | |
|
1.call echo %%b%a%%%
2.启动变量延时 echo !b%a%! |
|
| 第3楼 junyee | 发表于 2009-12-21 17:59 |
| 中级用户 发帖 112 积分 253 | |
|
谢谢楼上的,我给的是例子,但是实际上不能完成我想要达到的目的,
如下 ------------------------ 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转这么大个弯子。 |
|
| 第4楼 Hanyeguxing | 发表于 2009-12-21 18:37 |
| 银牌会员 发帖 897 积分 1,039 来自 在地狱中仰望天堂 | |
|
对于你写的批处理:
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要比其他的方法快,为什么 反而不用呢? [ Last edited by Hanyeguxing on 2009-12-21 at 22:08 ] |
|
| 第5楼 Hanyeguxing | 发表于 2009-12-21 22:02 |
| 银牌会员 发帖 897 积分 1,039 来自 在地狱中仰望天堂 | |
|
以你提供的数组为例,不存在重复的数组,数组均为2位,如果不想使用临时文件,不使用 sort ,可以这样写:
[ Last edited by Hanyeguxing on 2009-12-21 at 23:29 ] |
|
| 第6楼 HAT | 发表于 2009-12-22 00:01 |
| 版主 发帖 5,017 积分 9,023 | |
|
批处理中的变量延迟扩展、变量嵌套
http://bbs.bathome.cn/thread-2899-1-1.html |
|
| 第7楼 junyee | 发表于 2009-12-30 00:33 |
| 中级用户 发帖 112 积分 253 | |
|
版主能不能把链接的内容大致描述一下》》???
MS现在很多论坛都被伟大的柱国给 禾口`言皆`了。 bathome.cn已经打不开了。 |
|
| 第8楼 pdanniel66 | 发表于 2009-12-30 05:52 |
| 初级用户 发帖 64 积分 68 | |
|
可以使用google的库存档案试试看!
|
|
| 第9楼 pdanniel66 | 发表于 2009-12-30 05:53 |
| 初级用户 发帖 64 积分 68 | |
|
批处理中的变量延迟扩展、变量嵌套
【教程汇总】批处理中的变量延迟扩展、变量嵌套 引用: 参考《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之后,扩展特性和之前对环境变量的修改将一同消失,常用于批处理语句中 |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |