Board logo

标题: [其他] 变量型批处理函数的一些问题如何解决? [打印本页]

作者: 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

第一个问题也许可以这样
  1. set a=b
  2. set b=c
  3. 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所对应的变量;
比如现有:
  1. arrx[1]=a
  2. arrx[2]=b
  3. arrx[3]=abc
  4. arry[1]=X
  5. arry[2]=Y
  6. arry[3]=XYZ
复制代码
执行%pset:##=arrx,arry%后会得到变量,对应的变量值如下:
  1. a=X
  2. b=Y
  3. abc=XYZ
复制代码

作者: 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://bathome.net./) Powered by Discuz! 7.2