批处理之家's Archiver

defanive 发表于 2009-1-30 12:06

【发起项目】批处理的库文件编写,高手协助!

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

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

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

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

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

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

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



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

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

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

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

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

库文件的格式如下:[code]库文件版本
库文件作者
库文件所需要其他库文件的支持
使用库文件需要保留的内容
描述
//**//
开始定义[/code]如果实在不懂,我附上我自己写的NewArray.bcl库文件,实现定义一个1~3维的数组:[code]1.0
BatCodeer
不需要其他库的支持
Newarray标签,arrays变量
定义了NewArray标签,用于定义新的数组,支持1-3维度。
用法:call :NewArray "Array" "Var"
Array是形如array_2的字串符,其中array是数组名,2是一维长度。Var是数组的缺省值。定义二维数组则是形如array_2_2,三维则是array_2_2_2。
例如call :NewArray "array_2_2" "0",执行后变量array_1_1、array_1_2、array_2_1、array_2_2的值均为0
使用本库的时候可以给参数外加上双引号(如"array_2_2"),本库会自动处理
使用本库需要保留Newarray标签,arrays变量
//**//
:NewArray
if "%~1"=="" goto :EOF
for /f "eol= tokens=1-4 delims=_" %%1 in ("%~1") do (
        if "%%~2"=="" goto :EOF
        set arrays=%arrays%%%1;
        if "%%~3"=="" (
                for /l %%a in (1,1,%%2) do (
                        set "%%1_%%a=%~2"
                )
                goto :EOF
        ) else (
                if "%%~4"=="" (
                        for /l %%a in (1,1,%%2) do (
                                for /l %%b in (1,1,%%3) do (
                                        set "%%1_%%a_%%b=%~2"
                                )
                        )
                ) else (
                        for /l %%a in (1,1,%%2) do (
                                for /l %%b in (1,1,%%3) do (
                                        for /l %%c in (1,1,%%4) do (
                                                set "%%1_%%a_%%b_%%c=%~2"
                                        )
                                )
                        )
                )
        )
)
goto :EOF[/code]那么请大家协助我完成库文件的编写!

(以下两张图,一个是头部的设置,一个是库文件的界面)

BBCC 发表于 2009-1-30 12:45

类似的[url]http://www.cn-dos.net/forum/viewthread.php?tid=38969&fpage=1&highlight=[/url]函数
没什么人响应啊,希望这个能够有发展。
另外库文件里的__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

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

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

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


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

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

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

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

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

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

[[i] 本帖最后由 523066680 于 2009-1-30 21:07 编辑 [/i]]

defanive 发表于 2009-1-30 21:53

谢了楼上兄。。。

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

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

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

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

[code]:StrLen
setlocal enableextensions
set "str=a%~2"
set "str=%str:"=s%"
set "str=%str:^^=s%"
set "str=!str:%%=s!"
set /a strlength=0
:StrLen_1
set /a strlength+=1
if not "!str:~%strlength%,1!"=="" goto StrLen_1
endlocal&set /a "%~1=%strlength%-1"
goto :EOF[/code]

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

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

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

另外兄,帮忙写浮点运算。。。

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的啦

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

terse的解法 !!%x%^^* 是字符串
[quote]
@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
[/quote]

[[i] 本帖最后由 523066680 于 2009-1-31 13:05 编辑 [/i]]

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

初学批处理 也有楼主的一些想法 希望大家给点建议 下面的东西写了一整天喇[code]@echo off
setlocal Enabledelayedexpansion
::例如去某文本含有字符0的行并赋值给KK
::得到的值将寄存在KK1~ KK0为数组总个数
call :G_getstrrow 0 a.txt kk
echo %kk1%
echo %kk0%
pause
exit

::1.取文本行中指定的第N行 G_getrowstr 行数 文本 返回寄存变量
::2.取文本的总行数 G_getrows 文本 返回寄存变量
::3.合并多个字符串字符串 G_mergestr 返回寄存变量 字符串1 字符串2 ...
::4.将某字符串插入某文本尾部 G_inserttail 文本 字符串1 字符串2 ...
::5.统计文本长度G_counttxt 文本 返回长度变量
::6.统计变量长度G_countstr 变量 返回长度
::7.取文本出现行G_getstrrow 字符串 文本 寄存 (返回数组总个数保存

在0位)

::7
:G_getstrrow
set G_getstrrowsum=
set G_getstrrowtmp=
set G_getstrrowtmps=
set G_getstrrows=%3
for /f "delims=" %%i in ('findstr "%1" %2') do (
set /a "G_getstrrowsum+=1"
set G_getstrrowtmp=%%i
call :G_mergestr getstrrowtmpa %G_getstrrows% !G_getstrrowsum!
call :G_getstrrow_set !getstrrowtmpa!
)
set %G_getstrrows%0=!G_getstrrowsum!
set G_getstrrows=
set G_getstrrowtmp=
set G_getstrrowtmps=
goto :eof
:G_getstrrow_set
set G_getstrrowtmps=%1
set %G_getstrrowtmps%=!G_getstrrowtmp!
goto :eof


::6
:G_countstr
set G_string=%1
set G_countstr=%2
:G_countstrstart
if not "%G_string%"=="" (
set /a %G_countstr%+=1
set "G_string=%G_string:~1%"
goto G_countstrstart
)
set G_string=
set G_countstr=
goto :eof


::5
:G_counttxt
set G_counttxt=
set G_count=%2
for /f "delims=" %%i in (%1) do set G_counttxt=!G_counttxt!%%i
:G_counttxtstart
if not "%G_counttxt%"=="" (
set /a %G_count%+=1
set "G_counttxt=%G_counttxt:~1%"
goto G_counttxtstart
)
set G_count=
set G_counttxt=
goto :eof

::1
:G_getrowstr
set %3=
for /f "skip=%1 delims=" %%i in (%2) do (
set %3=%%i
goto :eof
)

::2
:G_getrows
set %2=0
for /f %%i in ('findstr /n .* %1') do (
set /a %2=%2+1
)
goto :eof

::3
:G_mergestr
set G_mergestr=%1
:G_getstr
if "%2"=="" goto mergestrend
set G_mergestrs=%G_mergestrs%%2
shift /2
goto G_getstr
:mergestrend
set %G_mergestr%=%G_mergestrs%
set G_mergestrs=
goto :eof

::4
:G_inserttail
set G_inserttailtxt=%1
:getG_inserttail
if "%2"=="" goto G_inserttailend
echo %2 >>%G_inserttailtxt%
shift /2
goto getG_inserttail
:G_inserttailend
set G_inserttailtxt=
goto :eof[/code]

Seter 发表于 2009-10-19 21:13

[quote]原帖由 [i]defanive[/i] 于 2009-2-1 20:46 发表 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=20121&ptid=3206][img]http://bbs.bathome.net/images/common/back.gif[/img][/url]
这个难度太高了。。。

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

结果后来解 ... [/quote]
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   在数组里查找其中一个指定元素[code]CreateArray <name> <size> <defaultvalue>
example:
     call :CreateArray array 10 %%%%i

GetLength  <name> <result>
example:
     call :GetLength array length

SetAt   <name> <index> <value>
example:
     call :SetAt array 6 我是第六个元素

GetAt   <name> <index> <result>
example:
     call :GetAt array 6 value

MapArray   <name> <index> <flag>
example:
     call :MapArray array "1 2 4 6" "set/a$item$+=$index[code]CreateArray <name> <size> <defaultvalue>
example:
     call :CreateArray array 10 %%%%i

GetLength  <name> <result>
example:
     call :GetLength array length

SetAt   <name> <index> <value>
example:
     call :SetAt array 6 我是第六个元素

GetAt   <name> <index> <result>
example:
     call :GetAt array 6 value

MapArray   <name> <index> <flag>
example:
     call :MapArray array "1 2 4 6" "set/a$item$+=$index$&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 :PushArray 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]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 :PushArray 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][code]示例:
创建50个文件夹
call :CreateArray array 50 %%%%i
call :MapArray array "md $value[code]示例:
创建50个文件夹
call :CreateArray array 50 %%%%i
call :MapArray array "md $value$&quot;
查找hello.txt文件中第二个hello
call :CreateArray array 1 ""
call :ReadArray array hello.txt
call :FindArray array re 2 hello
echo %re%[/code]quot;
查找hello.txt文件中第二个hello
call :CreateArray array 1 ""
call :ReadArray array hello.txt
call :FindArray array re 2 hello
echo %re%[/code][code]@echo off&setlocal enabledelayedexpansion
exit
:CreateArray
set %~1_class=Array
set %~1_length=%~2
for /l %%i in (1,1,%~2) do set "%~1_%%i=%~3"
goto :eof
:GetLength
set %~2=!%~1_length!
goto :eof
:SetAt
if %~2 gtr 0 if %~2 leq !%~1_length! set "%~1_%~2=%~3"
goto :eof
:GetAt
set  %~3=$NULL$&if %~2 gtr 0 if %~2 leq !%~1_length! set "%~3=!%~1_%~2!"
goto :eof
:EchoArray
set out=%~2
for /l %%i in (1,1,!%~1_length!) do set "t=!out:$index$=%%i!"&call,set "t=%%t:$value$=!%~1_%%i!%%"&echo !t!
goto :eof
:MapArray
set "out=%~3"
set fex=for %%i in (%~2)
if "%~2"=="All" set "fex=for /l %%i in (1,1,!%~1_length!)"
%fex% do set "t=!out:$item$=%~1_%%i!"&set "t=!t:$index$=%%i!"&call,set "t=%%t:$value$=!%~1_%%i!%%"&!t!
goto :eof
:InsertAt
set/ab=%~2+1
for /l %%i in (!%~1_length!,-1,%b%) do set/as=%%i+1&set "%~1_!s!=!%~1_%%i!"
set/a%~1_length+=1
set "%~1_%b%=%~3"
goto :eof
:InsertArray
for /l %%i in (!%~1_length!,-1,%~2) do set/as=%%i+!%~3_length!&set "%~1_!s!=!%~1_%%i!"
for /l %%i in (1,1,!%~3_length!) do set/as=%%i+%~2&set "%~1_!s!=!%~3_%%i!"
set/a%~1_length+=%~3_length
goto :eof
:RemoveArray
set/ab=%~2+1
set/ae=%~1_length-%~3
for /l %%i in (%b%,1,%e%) do set/as=%%i+%~3&call,set "%~1_%%i=%%%~1_!s!%%"
set/a%~1_length-=%~3
goto :eof
:RemoveAll
set %~1_length=0
goto :eof
:IsEmpty
if %~3 "!%~1_length!"=="0" %2
goto :eof
:PushArray
set/a%~1_length+=1
set "%~1_!%~1_length!=%~2"
goto :eof
:PopArray
set "%~2=%~1_!%~1_length!"
set/a%~1_length-1
goto :eof
:ReadArray
set %~1_length=0
if "%~2" neq "" (for /f "delims=" %%i in (%2) do set/a%~1_length+=1&set "%~1_!%~1_length!=%%i")&goto :eof
set/pt=%~3
:k
if "!t!"=="%~4" goto :eof
set/a%~1_length+=1
set %~1_!%~1_length!=!t!
set/pt=%~3
goto k
:FindArray
set %~2=$NULL$&set b=0
for /l %%i in (1,1,!%~1_length!) do if "!%~1_%%i!"=="%~4" set/ab+=1&if !b!==%~3 set %~2=%%i&goto :eof
goto :eof[/code]搞定...回家睡睡~

caruko 发表于 2009-12-3 14:08

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

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

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.