Board logo

标题: 【发起项目】批处理的库文件编写,高手协助! [打印本页]

作者: defanive    时间: 2009-1-30 12:06     标题: 【发起项目】批处理的库文件编写,高手协助!

注意,本项目由高手协助编写,尽量不要来一些意义不大的回复!

库文件是什么,大家可能看不懂。。。

现在正在编写一个批处理编写的软件,另辟蹊径。。。

这个软件的看点在于,对于复杂的编写只需要一行带过,然后再给加入功能相应的库文件。。。

首先,在这软件中编写批处理生成的是bcp工程文件,工程文件分三部分,头部、代码、库文件。。。

例如,我想实现统计变量长度的功能,只需要 call enStr var varlen 就可以了,变量var的长度保存在了varlen里面,然后在工程里面添加上“LenStr.bcl”文件。而在“LenStr.bcl”文件里面已经为我们写好了获得变量长度的功能。

当bcp需要编译成bat的时候,软件会将头部(color、mode等命令)和代码,还有库文件中的定义都保存进bat去。。。



现在大家大概都明白了库文件的意思了吧。。。

(对,库文件就像C++的头文件一样,帮你把麻烦的事情做好,你需要用只需要一句#include就可以了。。。)

那么我的项目就是希望大家能帮忙编写多点库文件。。。

现在大概有四个类别的库文件:数组(想高级语言一样,伪数组)、计算(浮点运算)、字串(常用处理,获取长度等)、时间(加减、比较等)

现在请大家帮忙编写库文件。。。

库文件的格式如下:
  1. 库文件版本
  2. 库文件作者
  3. 库文件所需要其他库文件的支持
  4. 使用库文件需要保留的内容
  5. 描述
  6. //**//
  7. 开始定义
复制代码
如果实在不懂,我附上我自己写的NewArray.bcl库文件,实现定义一个1~3维的数组:
  1. 1.0
  2. BatCodeer
  3. 不需要其他库的支持
  4. Newarray标签,arrays变量
  5. 定义了NewArray标签,用于定义新的数组,支持1-3维度。
  6. 用法:call :NewArray "Array" "Var"
  7. Array是形如array_2的字串符,其中array是数组名,2是一维长度。Var是数组的缺省值。定义二维数组则是形如array_2_2,三维则是array_2_2_2。
  8. 例如call :NewArray "array_2_2" "0",执行后变量array_1_1、array_1_2、array_2_1、array_2_2的值均为0
  9. 使用本库的时候可以给参数外加上双引号(如"array_2_2"),本库会自动处理
  10. 使用本库需要保留Newarray标签,arrays变量
  11. //**//
  12. :NewArray
  13. if "%~1"=="" goto :EOF
  14. for /f "eol= tokens=1-4 delims=_" %%1 in ("%~1") do (
  15.         if "%%~2"=="" goto :EOF
  16.         set arrays=%arrays%%%1;
  17.         if "%%~3"=="" (
  18.                 for /l %%a in (1,1,%%2) do (
  19.                         set "%%1_%%a=%~2"
  20.                 )
  21.                 goto :EOF
  22.         ) else (
  23.                 if "%%~4"=="" (
  24.                         for /l %%a in (1,1,%%2) do (
  25.                                 for /l %%b in (1,1,%%3) do (
  26.                                         set "%%1_%%a_%%b=%~2"
  27.                                 )
  28.                         )
  29.                 ) else (
  30.                         for /l %%a in (1,1,%%2) do (
  31.                                 for /l %%b in (1,1,%%3) do (
  32.                                         for /l %%c in (1,1,%%4) do (
  33.                                                 set "%%1_%%a_%%b_%%c=%~2"
  34.                                         )
  35.                                 )
  36.                         )
  37.                 )
  38.         )
  39. )
  40. goto :EOF
复制代码
那么请大家协助我完成库文件的编写!

(以下两张图,一个是头部的设置,一个是库文件的界面)
作者: BBCC    时间: 2009-1-30 12:45

类似的http://www.cn-dos.net/forum/view ... ge=1&highlight=函数
没什么人响应啊,希望这个能够有发展。
另外库文件里的__doc__最好使用英语吧?如果用中文可能会有一些比较麻烦的东西要处理。

anyway,我希望能够看见成果。(虽说windows开始转向powershell了)
作者: 523066680    时间: 2009-1-30 12:53

插一个,希望不会影响浏览……
    应该是说类似函数的东西吧,俺有在%userprofile%下放一些
函数,开始运行cmd时调用,比如说这个

RT.bat
:----------------------------------------------
systeminfo |find "系统启动时间:"
:----------------------------------------------
当我要查看系统运行时间的时候就 打RT指令,看自己玩多久电脑了。


顶贴 ,拿分 , 闪人……
作者: defanive    时间: 2009-1-30 13:08

不错,能放到 时间 类里面,不过功能好像太少了。。。

有没有人帮忙完善 数组 类的,这个很重要。。。
(PS:已经写好NewArray、GetArrayWides、GetArrayNums)
希望帮忙写CopyArray等。C里面数组相关的函数都可以写上。。。

另外,字符 类的也很紧要啊,获得变量长度、是否纯英文、是否纯数字、英文转大小写、倒序,还有N多库都没写啊,大家帮帮忙

最难的应该就是 计算 类了吧,有兴趣可以挑战一下,主要是浮点运算,加减乘除先弄一个吧,然后绝对值、平方、N次方、四舍五入、退一法、进一法,最难度就是开方了。。。
作者: defanive    时间: 2009-1-30 13:39     标题: 需要协助:字符长度

:StrLen
for /f "skip=1 delims=:" %%a in ('^(echo "%~1"^&echo.^)^|findstr /o ".*"') do set /a "%~2=%%a-5"
goto :EOF

这是代码,但是对于 ^ % ! " 会失效,帮助完善!
作者: 523066680    时间: 2009-1-30 14:48

讨论一个,  我觉得这是非常非常麻烦的事情 因为很多前辈都讨论过这个问题。   又似乎有解决过的足迹,搜搜看吧。
  有想借用vbs的念头,但是建立纯批的函数也是有一定意义的,
大伙努力吧。
作者: defanive    时间: 2009-1-30 15:10

肯定有意义,对于用我这软件来编写P来所,麻烦的功能打个勾就可以了。。。
作者: 523066680    时间: 2009-1-30 21:05

看着进度这么慢  我也不忍  这帖子真不是时候 论坛好少人,可能大家都还在老家  哎~

      我又对这方面兴趣不大,不过回想起我在某个帖子里有收集一些关于字符串处理的连接 这里贴出来

那个帖子“http://bbs.bathome.net/thread-3136-1-1.html


-------------------------------------------------------------
    如何判断变量的长度??
原文链接为:http://www.cn-dos.net/forum/viewthread.php?tid=24745

---------------------------------------------------------------
    [求助]如何获得字符的字数和截取字符
原文链接为:http://www.cn-dos.net/forum/viewthread.php?tid=28571

---------------------------------------------------------------
   [精彩][批处理字符出现次数统计]
原文链接为:http://www.cn-dos.net/forum/viewthread.php?tid=25182

类似的一个
    如何统计某个字符串在文本中出现的次数?
原文链接为:http://www.cn-dos.net/forum/viewthread.php?tid=21250

---------------------------------------------------------------
又抓到一个帖子了,标题: 如何验证输入的字符串包含双字节字符
http://www.cn-dos.net/forum/viewthread.php?tid=36780

---------------------------------------------------------------
标题: [已解决]优化一下计算字符串长度的代码,谢谢!
http://www.cn-dos.net/forum/viewthread.php?tid=39292

[ 本帖最后由 523066680 于 2009-1-30 21:07 编辑 ]
作者: defanive    时间: 2009-1-30 21:53

谢了楼上兄。。。

这方面的资料都看过,可是特殊字符的处理实在困难。。。

我写了个雏形,兄帮忙看下。。。

使用时call :StrLen "a" "123"

123的长度3就保存在变量a里面了(外层引号自动处理)

  1. :StrLen
  2. setlocal enableextensions
  3. set "str=a%~2"
  4. set "str=%str:"=s%"
  5. set "str=%str:^^=s%"
  6. set "str=!str:%%=s!"
  7. set /a strlength=0
  8. :StrLen_1
  9. set /a strlength+=1
  10. if not "!str:~%strlength%,1!"=="" goto StrLen_1
  11. endlocal&set /a "%~1=%strlength%-1"
  12. goto :EOF
复制代码


可是有两个字符还有麻烦:%、!

!号和%号在传递的时候被预处理掉了,其他符号就没问题了

如果实在没有办法,就用这个了

另外兄,帮忙写浮点运算。。。
作者: BBCC    时间: 2009-1-30 23:01

这活不能急吧,罗马非一日建成.
作者: defanive    时间: 2009-1-30 23:08

这个库文件嘛,数组相关的至少要有7个以上,现在才写了3个。。。

还有很多都才完成0%。。。

人多好办事,没人帮忙啊。。。
作者: BBCC    时间: 2009-1-30 23:11

没听说过那个Ritchie Lawrence?
作者: defanive    时间: 2009-1-30 23:18

他的东西我都看了,很多都是日期方面的,这些我都会加上。。。

可是 数组、计算、字串 等库都没写啊。。。
作者: 523066680    时间: 2009-1-31 13:03

我这边测试9楼的代码 怎么变成死循环了,有些晕~

另外 你惨了 叫你翻老贴好像没翻~  我列的都是cn-dos 还有咱bathome的啦

看这里:http://bbs.bathome.net/viewthread.php?tid=1480

terse的解法 !!%x%^^* 是字符串
@echo off
::!!%x%^^*
for /f "skip=1 delims=" %%i in ('type %0') do set "str=%%i"&goto lp
:lp
    setlocal enabledelayedexpansion
    for /l %%i in (1,1,255) do if "!str:~%%i!"=="" set/a n=%%i-2&echo !n!&pause&exit

[ 本帖最后由 523066680 于 2009-1-31 13:05 编辑 ]
作者: defanive    时间: 2009-1-31 13:09

楼上的代码我也想过,可是做函数库就不行了。。。

函数库讲求的是通用性,你不知道别人传给你的参数有多长,如果大于255那只能永远得出长度255了。。。
作者: 523066680    时间: 2009-1-31 14:01

有打算试着修改。

额 还有 那个…… 你觉得做个 计算分数运算的函数怎么样

不进行四舍五入 得到的答案如果非整数就用分数表示

表个态 我觉得这挺有趣的,可能另外发帖讨论。
作者: defanive    时间: 2009-1-31 16:10

这个难度太高了,涉及约分、最简分数等,而且繁分数还要一起返回括号?

小数的问题处理完了,作为一个单独的高难度专题来讨论编写。。。
作者: pusofalse    时间: 2009-2-1 00:53

若是来上一句类似于#include的语句,感觉只有改变批处理的运行机制才行。 实在想不出批处理该如何调用其他文件中的函数,或许是因为脑子少根弦想象不到。若是先在自身中找函数,若找不到就到库文件中找,其中是否会涉及到函数名重复及效率的问题。感觉有好多障碍,拭目以待~
作者: defanive    时间: 2009-2-1 13:12

哈哈,楼上想复杂了。。。

如果我能够改变批处理的运行机制的话,那就强大了。。。
作者: 523066680    时间: 2009-2-1 19:56

你能原创一个脚本形式 或者平台 那才爽……  OMG 全论坛人都会支持的……
作者: defanive    时间: 2009-2-1 20:46

这个难度太高了。。。

我之前也有段时间在想一个新的批处理解释器(就是cmd类似的东东),这个解释器能自动把鼠标、键盘等信息返回到批处理变量里面,还运行批处理删除、增加、禁止右键菜单等。。。

结果后来解释器不能操作变量,貌似system函数对set无爱,结果就放弃了。。。
作者: defanive    时间: 2009-2-1 20:48

用新的脚本形式和平台前提就是有一个好的解释器。。。

批处理的解释器都不行,脚本形式和平台就更无可能了。。。
作者: qq362220083    时间: 2009-3-18 16:44

推荐看下PE系统的PECMD.exe,功能比较强大,呵呵
作者: netbenton    时间: 2009-4-10 22:28

@echo off&setlocal enabledelayedexpansion
set a=%1
set b=%2
echo %time%
call :sub c a b
echo %time%

echo %c%
goto :eof

:::::::::::::::::::::::::::::::
::浮点减法函数
:sub <接收变量> <被减数变量> <减数变量>
::
::
::支持49位整数,49小数
::自动丢弃首尾无效0
::别看代码那么长,速度可不慢哦
:::::::::::::::::::::::::::::::
@echo off&setlocal enabledelayedexpansion
set cc=0
set za=!%2:*.=!
set xa=!%2:.%za%=!
set zb=!%3:*.=!
set xb=!%3:.%zb%=!
if "!zb!."=="!%3!." set zb=0
if "!za!."=="!%2!." set za=0
set za=%za%0
set zb=%zb%0
::补0对齐
for /l %%a in (0,9,81) do (
if "!xa!!xb!"=="" set n=%%a&goto :bu0
if defined xa (set ya=!xa:~-9!!ya!&set xa=!xa:~0,-9!) else (set ya=000000000!ya!)
if defined xb (set yb=!xb:~-9!!yb!&set xb=!xb:~0,-9!) else (set yb=000000000!yb!)
)
:bu0
set ya=0000000000%ya%
set yb=0000000000%yb%
set xa=!ya:~-%n%!
set xb=!yb:~-%n%!
if "%xa%%za%" gtr "%xb%%zb%" (
        set zz=!za!&set xx=!xa!&set fh=
) else (
        set zz=!zb!&set xx=!xb!&set zb=!za!&set xb=!xa!&set fh=-
)

::预处理完成

for /l %%a in (0,9,81) do (
        if "!zz:~%%a,9!!zb:~%%a,9!"=="" goto :xok
        set "zz%%a=!zz:~%%a,9!000000000"
        set "zb%%a=!zb:~%%a,9!000000000"
        set zz%%a=1!zz%%a:~0,9!
        set zb%%a=1!zb%%a:~0,9!
        set zm=%%a
)
:xok
set jw=0
for /l %%a in (%zm%,-9,0) do (
        set/a "zz=jw+zz%%a-zb%%a"
        if !zz! lss 0 (set/a zz=1000000000+zz&set jw=-1) else (set jw=0)
        set zy=000000000!zz!
        set zx=!zy:~-9!!zx!
)
set/a zm+=9,n=zm
for /l %%a in (1,1,%zm%) do if "!zx:~-%%a,1!"=="0" (set n=-%%a) else (goto :cok)
:cok
if "!zx:~-%zm%,%n%!" gtr "0" (set cc=.!zx:~-%zm%,%n%!) else (set cc=)
set zy=
for /l %%a in (9,9,81) do (
        if "!xx!!xb!"=="" goto :end
        set cc=!zy!!cc!
if defined xx (set "aa=000000000!xx:~-9!"&set xx=!xx:~0,-9!) else (set aa=000000000)
if defined xb (set "bb=000000000!xb:~-9!"&set xb=!xb:~0,-9!) else (set bb=000000000)
        set/a zz=jw+1!aa:~-9!-1!bb:~-9!
        if !zz! lss 0 (set/a zz=1000000000+zz&set jw=-1) else (set jw=0)
        set zy=000000000!zz!
        set zy=!zy:~-9!
)
:end
set cc=%zz%%cc%
if "%cc%"=="0" goto :endok
if "%cc:~0,2%"=="0." goto :endok
for /l %%a in (0,1,36) do if not "!cc:~%%a,1!"=="0" (set cc=!cc:~%%a!&goto :endok)
:endok

endlocal&set %1=%fh%%cc%&goto :eof
作者: defanive    时间: 2009-4-10 22:48     标题: 回复 24楼 的帖子

感谢提供,不过貌似库里已经有一个减法的了。。。
作者: k515413928    时间: 2009-10-19 15:42

初学批处理 也有楼主的一些想法 希望大家给点建议 下面的东西写了一整天喇
  1. @echo off
  2. setlocal Enabledelayedexpansion
  3. ::例如去某文本含有字符0的行并赋值给KK
  4. ::得到的值将寄存在KK1~ KK0为数组总个数
  5. call :G_getstrrow 0 a.txt kk
  6. echo %kk1%
  7. echo %kk0%
  8. pause
  9. exit
  10. ::1.取文本行中指定的第N行 G_getrowstr 行数 文本 返回寄存变量
  11. ::2.取文本的总行数 G_getrows 文本 返回寄存变量
  12. ::3.合并多个字符串字符串 G_mergestr 返回寄存变量 字符串1 字符串2 ...
  13. ::4.将某字符串插入某文本尾部 G_inserttail 文本 字符串1 字符串2 ...
  14. ::5.统计文本长度G_counttxt 文本 返回长度变量
  15. ::6.统计变量长度G_countstr 变量 返回长度
  16. ::7.取文本出现行G_getstrrow 字符串 文本 寄存 (返回数组总个数保存
  17. 在0位)
  18. ::7
  19. :G_getstrrow
  20. set G_getstrrowsum=
  21. set G_getstrrowtmp=
  22. set G_getstrrowtmps=
  23. set G_getstrrows=%3
  24. for /f "delims=" %%i in ('findstr "%1" %2') do (
  25. set /a "G_getstrrowsum+=1"
  26. set G_getstrrowtmp=%%i
  27. call :G_mergestr getstrrowtmpa %G_getstrrows% !G_getstrrowsum!
  28. call :G_getstrrow_set !getstrrowtmpa!
  29. )
  30. set %G_getstrrows%0=!G_getstrrowsum!
  31. set G_getstrrows=
  32. set G_getstrrowtmp=
  33. set G_getstrrowtmps=
  34. goto :eof
  35. :G_getstrrow_set
  36. set G_getstrrowtmps=%1
  37. set %G_getstrrowtmps%=!G_getstrrowtmp!
  38. goto :eof
  39. ::6
  40. :G_countstr
  41. set G_string=%1
  42. set G_countstr=%2
  43. :G_countstrstart
  44. if not "%G_string%"=="" (
  45. set /a %G_countstr%+=1
  46. set "G_string=%G_string:~1%"
  47. goto G_countstrstart
  48. )
  49. set G_string=
  50. set G_countstr=
  51. goto :eof
  52. ::5
  53. :G_counttxt
  54. set G_counttxt=
  55. set G_count=%2
  56. for /f "delims=" %%i in (%1) do set G_counttxt=!G_counttxt!%%i
  57. :G_counttxtstart
  58. if not "%G_counttxt%"=="" (
  59. set /a %G_count%+=1
  60. set "G_counttxt=%G_counttxt:~1%"
  61. goto G_counttxtstart
  62. )
  63. set G_count=
  64. set G_counttxt=
  65. goto :eof
  66. ::1
  67. :G_getrowstr
  68. set %3=
  69. for /f "skip=%1 delims=" %%i in (%2) do (
  70. set %3=%%i
  71. goto :eof
  72. )
  73. ::2
  74. :G_getrows
  75. set %2=0
  76. for /f %%i in ('findstr /n .* %1') do (
  77. set /a %2=%2+1
  78. )
  79. goto :eof
  80. ::3
  81. :G_mergestr
  82. set G_mergestr=%1
  83. :G_getstr
  84. if "%2"=="" goto mergestrend
  85. set G_mergestrs=%G_mergestrs%%2
  86. shift /2
  87. goto G_getstr
  88. :mergestrend
  89. set %G_mergestr%=%G_mergestrs%
  90. set G_mergestrs=
  91. goto :eof
  92. ::4
  93. :G_inserttail
  94. set G_inserttailtxt=%1
  95. :getG_inserttail
  96. if "%2"=="" goto G_inserttailend
  97. echo %2 >>%G_inserttailtxt%
  98. shift /2
  99. goto getG_inserttail
  100. :G_inserttailend
  101. set G_inserttailtxt=
  102. goto :eof
复制代码

作者: Seter    时间: 2009-10-19 21:13

原帖由 defanive 于 2009-2-1 20:46 发表
这个难度太高了。。。

我之前也有段时间在想一个新的批处理解释器(就是cmd类似的东东),这个解释器能自动把鼠标、键盘等信息返回到批处理变量里面,还运行批处理删除、增加、禁止右键菜单等。。。

结果后来解 ...

system尽量不要用,有系统API摆着呢
话说我可以用P处理做个红黑树链表用于快速查找数据...哈哈...
作者: Seter    时间: 2009-11-7 21:11

做了个普通的Array..还没改成专用的形式嘿嘿,好心人帮助下咯
也没提供特殊字符&输入错误处理
提供以下函数:
CreateArray 创建一个数组,注意:从_1开始
GetLength  获取数组长度
SetAt   设置特定位置元素
GetAt   获取特定位置元素
MapArray   对整个(或指定多个位置)数组执行相同操作
EchoArray   以指定方式输出整个元素
InsertAt     在指定位置后插入一个元素
InsertArray  在指定位置后插入一个以CreateArray创建的数组
RemoveArray   删除指定位置后指定个元素
RemoveAll   清空数组
IsEmpty    若数组(不)为空,执行指定操作
PushArray   在数组末尾增加一个元素
PopArray    弹出数组末尾的一个元素
ReadArray   从文件(或控制台输入)读取数组元素
FindArray   在数组里查找其中一个指定元素
  1. CreateArray <name> <size> <defaultvalue>
  2. example:
  3.      call :CreateArray array 10 %%%%i
  4. GetLength  <name> <result>
  5. example:
  6.      call :GetLength array length
  7. SetAt   <name> <index> <value>
  8. example:
  9.      call :SetAt array 6 我是第六个元素
  10. GetAt   <name> <index> <result>
  11. example:
  12.      call :GetAt array 6 value
  13. MapArray   <name> <index> <flag>
  14. example:
  15.      call :MapArray array "1 2 4 6" "set/a$item$+=$index[code]CreateArray <name> <size> <defaultvalue>
  16. example:
  17.      call :CreateArray array 10 %%%%i
  18. GetLength  <name> <result>
  19. example:
  20.      call :GetLength array length
  21. SetAt   <name> <index> <value>
  22. example:
  23.      call :SetAt array 6 我是第六个元素
  24. GetAt   <name> <index> <result>
  25. example:
  26.      call :GetAt array 6 value
  27. MapArray   <name> <index> <flag>
  28. example:
  29.      call :MapArray array "1 2 4 6" "set/a$item$+=$index$&quot;
  30.      rem   以上代码将array中第1个数据加1,第2个数据加2,第4个数据加4,第6个数据加6
  31.      call :MapArray array All "fsutil file createnew $value$.txt"
  32. EchoArray   <name> <flag>
  33. example:
  34.      call :EchoArray array "第$index$个元素是$value$&quot;
  35. InsertAt   <name> <index> <value>
  36. example:
  37.      call :InsertAt array 0 我是第一个元素咯
  38. InsertArray  <name> <index> <array>
  39. example:
  40.      call :CreateArray array 10 %%%%i
  41.      call :CreateArray array2 4 新%%%%i
  42.      call :InsertArray array 3 array2
  43. RemoveArray   <name> <index> <count>
  44. example:
  45.      call :RemoveArray array 3 2
  46.      rem 以上代码删去第4,5个元素
  47. RemoveAll  <name>
  48. example:
  49.      call :RemoveAll array
  50. IsEmpty    <name> <flag> {not}
  51. example:
  52.      call :IsEmpty array 空了空了
  53.   call :IsEmpty array 里面还有东西呢 not
  54. PushArray   <name> <value>
  55. example:
  56.      call :PushArray array 我是新人
  57. PopArray    <name> <result>
  58. example:
  59.      call :PopArray array Result
  60. ReadArray   <name> <file>|<"" <tip> <endflag>>
  61. example:
  62.      call :ReadArray array input.txt
  63.      call :ReadArray array "" Input: " "
  64.      rem endflag即结束标志...以上代码表示输入的是空格时结束
  65. FindArray   <name> <result> <findindex> <findstring>
  66. example:
  67.      call :FindArray array result 2 找我啊
  68.   rem 以上代码查找array数组中第二个"找我啊",没找到返回$NULL$
复制代码
quot;
     rem   以上代码将array中第1个数据加1,第2个数据加2,第4个数据加4,第6个数据加6
     call :MapArray array All "fsutil file createnew $value$.txt"

EchoArray   <name> <flag>
example:
     call :EchoArray array "第$index$个元素是$value$&quot;

InsertAt   <name> <index> <value>
example:
     call :InsertAt array 0 我是第一个元素咯

InsertArray  <name> <index> <array>
example:
     call :CreateArray array 10 %%%%i
     call :CreateArray array2 4 新%%%%i
     call :InsertArray array 3 array2

RemoveArray   <name> <index> <count>
example:
     call :RemoveArray array 3 2
     rem 以上代码删去第4,5个元素

RemoveAll  <name>
example:
     call :RemoveAll array

IsEmpty    <name> <flag> {not}
example:
     call :IsEmpty array 空了空了
  call :IsEmpty array 里面还有东西呢 not

PushArray   <name> <value>
example:
     call ushArray array 我是新人

PopArray    <name> <result>
example:
     call :PopArray array Result

ReadArray   <name> <file>|<"" <tip> <endflag>>
example:
     call :ReadArray array input.txt
     call :ReadArray array "" Input: " "
     rem endflag即结束标志...以上代码表示输入的是空格时结束

FindArray   <name> <result> <findindex> <findstring>
example:
     call :FindArray array result 2 找我啊
  rem 以上代码查找array数组中第二个"找我啊",没找到返回$NULL$[/code]
  1. 示例:
  2. 创建50个文件夹
  3. call :CreateArray array 50 %%%%i
  4. call :MapArray array "md $value[code]示例:
  5. 创建50个文件夹
  6. call :CreateArray array 50 %%%%i
  7. call :MapArray array "md $value$&quot;
  8. 查找hello.txt文件中第二个hello
  9. call :CreateArray array 1 ""
  10. call :ReadArray array hello.txt
  11. call :FindArray array re 2 hello
  12. echo %re%
复制代码
quot;
查找hello.txt文件中第二个hello
call :CreateArray array 1 ""
call :ReadArray array hello.txt
call :FindArray array re 2 hello
echo %re%[/code]
  1. @echo off&setlocal enabledelayedexpansion
  2. exit
  3. :CreateArray
  4. set %~1_class=Array
  5. set %~1_length=%~2
  6. for /l %%i in (1,1,%~2) do set "%~1_%%i=%~3"
  7. goto :eof
  8. :GetLength
  9. set %~2=!%~1_length!
  10. goto :eof
  11. :SetAt
  12. if %~2 gtr 0 if %~2 leq !%~1_length! set "%~1_%~2=%~3"
  13. goto :eof
  14. :GetAt
  15. set  %~3=$NULL$&if %~2 gtr 0 if %~2 leq !%~1_length! set "%~3=!%~1_%~2!"
  16. goto :eof
  17. :EchoArray
  18. set out=%~2
  19. for /l %%i in (1,1,!%~1_length!) do set "t=!out:$index$=%%i!"&call,set "t=%%t:$value$=!%~1_%%i!%%"&echo !t!
  20. goto :eof
  21. :MapArray
  22. set "out=%~3"
  23. set fex=for %%i in (%~2)
  24. if "%~2"=="All" set "fex=for /l %%i in (1,1,!%~1_length!)"
  25. %fex% do set "t=!out:$item$=%~1_%%i!"&set "t=!t:$index$=%%i!"&call,set "t=%%t:$value$=!%~1_%%i!%%"&!t!
  26. goto :eof
  27. :InsertAt
  28. set/ab=%~2+1
  29. for /l %%i in (!%~1_length!,-1,%b%) do set/as=%%i+1&set "%~1_!s!=!%~1_%%i!"
  30. set/a%~1_length+=1
  31. set "%~1_%b%=%~3"
  32. goto :eof
  33. :InsertArray
  34. for /l %%i in (!%~1_length!,-1,%~2) do set/as=%%i+!%~3_length!&set "%~1_!s!=!%~1_%%i!"
  35. for /l %%i in (1,1,!%~3_length!) do set/as=%%i+%~2&set "%~1_!s!=!%~3_%%i!"
  36. set/a%~1_length+=%~3_length
  37. goto :eof
  38. :RemoveArray
  39. set/ab=%~2+1
  40. set/ae=%~1_length-%~3
  41. for /l %%i in (%b%,1,%e%) do set/as=%%i+%~3&call,set "%~1_%%i=%%%~1_!s!%%"
  42. set/a%~1_length-=%~3
  43. goto :eof
  44. :RemoveAll
  45. set %~1_length=0
  46. goto :eof
  47. :IsEmpty
  48. if %~3 "!%~1_length!"=="0" %2
  49. goto :eof
  50. :PushArray
  51. set/a%~1_length+=1
  52. set "%~1_!%~1_length!=%~2"
  53. goto :eof
  54. :PopArray
  55. set "%~2=%~1_!%~1_length!"
  56. set/a%~1_length-1
  57. goto :eof
  58. :ReadArray
  59. set %~1_length=0
  60. if "%~2" neq "" (for /f "delims=" %%i in (%2) do set/a%~1_length+=1&set "%~1_!%~1_length!=%%i")&goto :eof
  61. set/pt=%~3
  62. :k
  63. if "!t!"=="%~4" goto :eof
  64. set/a%~1_length+=1
  65. set %~1_!%~1_length!=!t!
  66. set/pt=%~3
  67. goto k
  68. :FindArray
  69. set %~2=$NULL$&set b=0
  70. for /l %%i in (1,1,!%~1_length!) do if "!%~1_%%i!"=="%~4" set/ab+=1&if !b!==%~3 set %~2=%%i&goto :eof
  71. goto :eof
复制代码
搞定...回家睡睡~
作者: caruko    时间: 2009-12-3 14:08

数组不是批处理强项,要求效率以及复杂应用的还是用VBS,AUTOIT,PSHELL吧...
或者借助第三方工具..

[ 本帖最后由 caruko 于 2009-12-4 08:46 编辑 ]




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2