标题: [其他] 变量型批处理函数的一些问题如何解决? [打印本页]
作者: defanive 时间: 2011-8-13 20:48 标题: 变量型批处理函数的一些问题如何解决?
http://www.bathome.net/viewthread.php?tid=5861
帖子里面提出了将函数定义为变量来使用
个人认为这种方法十分的好,速度上与直接使用代码一致,而又可以封装细节代码,让主程序显得更简洁更通用
继续研究中发现还是有一些问题需要解决
多层嵌套不能实现
例如无法实现echo !%a%!,必须需要call %%!a!%%,对于非常常用的两层来说无疑降低了效率
多个独立for的问题
例如无法实现两个独立的for循环,总是会将第二个for作为第一个for的do子语句
这两个问题影响到使用,一起看看有没有什么解决方法,不然遇到这种情况还是只能用标签类型的函数
作者: CrLf 时间: 2011-8-13 21:24
第一个问题也许可以这样- set a=b
- set b=c
- for /f "delims=" %%a in ("!a!") do echo !%%a!
复制代码
第二个问题看不太懂
作者: cjiabing 时间: 2011-8-13 21:47
我也看不懂第二个。
前面我提问有关CMD的问题(在CMD里实现标签跳转和循环功能),看来与此是同一个目的,就是简化和扩展代码功能。
我经常调用start /b cmd /c command 来执行命令,但后面这个command通常不能分行、不能使用标签跳转、不能循环执行、不能回传参数,只好使用变量函数将这个命令揉成一团了。——有点变态。
作者: plp626 时间: 2011-8-14 12:21
本帖最后由 plp626 于 2011-8-14 12:27 编辑
非常好的话题,无奈讨论的人真的很少,变量型函数(有时我叫它内敛函数)迟早会引起大家广泛关注,现在没有,只是时间问题;如果有bat人对批处理函数感兴趣,变量型函数是最佳研究对象;
关于楼主的问题
变量嵌套用多层for变量解释;对于独立for循环,加括号()用&连接即可;
=============================================
我遇到的问题是:
对我的脑袋来说,某些必须用预处理%%扩展后解释执行的复合语句(变量型函数就属于这样的语句)如何扩展,即变量型函数内不能再含有变量型函数,更不能递归(要突破这两点可能需要大家共同的智慧);
还有就是变量名空间的问题,我们用这类函数两个目的,短小加速度,变量型函数如果每个都要用setlocal和endlocal获得返回值,这个开销也是不小的,代码长了近100字节,速度也降低了,对于多个变量的返回这样的做法很难处理,要额外增加不少空间和时间的开销。
于是我都是用特殊前缀来标识函数中的变量,这样很简洁,但新的问题是我们如何有效管理这些垃圾变量?
====================================
没有真正接触这类变量型函数的编写,可能看帖不知所云,这很正常;大家对很多问题的表述所用的术语也不统一,这更是导致了理解上的困难;
为此我出几道题,大家编写试试,以体会楼主和我所云;
getnl函数
执行%getnl:##=nl%后,nl变量的值变成换行符;
pset函数
执行%pset:##=arrx,arry%后,把arrx所对应的变量值做为变量名,把arry所对应的变量值赋逐一赋给arrx所对应的变量;
比如现有:- arrx[1]=a
- arrx[2]=b
- arrx[3]=abc
- arry[1]=X
- arry[2]=Y
- arry[3]=XYZ
复制代码
执行%pset:##=arrx,arry%后会得到变量,对应的变量值如下:复制代码
作者: defanive 时间: 2011-8-14 23:39
第一个问题的解决非常好,看起来我真是笨了。。。
第二个问题,for+()+&这样连接两个独立的for循环是没用的,例如代码
for /l %%a in (1,1,2) do (echo %%a)&for /l %%b in (5,1,6) do (echo %%b)
这样执行会发现输出结果是1\5\6\2\5\6而不是期望的1\2\5\6
看起来cmd会把do后面的全部内容都看为for的循环体,而不管()
作者: defanive 时间: 2011-8-14 23:40
变量型函数是必须研究的一个问题,效率上没有太大缺陷,又能节省重复代码,还得感谢netbenton提出的这个想法
作者: abcdshenji 时间: 2011-8-15 01:06
回复 5# defanive
为什么不多加个括弧呢?
(for /l %%a in (1,1,2) do (echo %%a))&for /l %%b in (5,1,6) do (echo %%b)
作者: defanive 时间: 2011-8-15 01:12
回复 7# abcdshenji
thx,看起来水平下降不少啊
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |