标题: 【发起项目】批处理的库文件编写,高手协助! [打印本页]
作者: defanive 时间: 2009-1-30 12:06 标题: 【发起项目】批处理的库文件编写,高手协助!
注意,本项目由高手协助编写,尽量不要来一些意义不大的回复!
库文件是什么,大家可能看不懂。。。
现在正在编写一个批处理编写的软件,另辟蹊径。。。
这个软件的看点在于,对于复杂的编写只需要一行带过,然后再给加入功能相应的库文件。。。
首先,在这软件中编写批处理生成的是bcp工程文件,工程文件分三部分,头部、代码、库文件。。。
例如,我想实现统计变量长度的功能,只需要 call enStr var varlen 就可以了,变量var的长度保存在了varlen里面,然后在工程里面添加上“LenStr.bcl”文件。而在“LenStr.bcl”文件里面已经为我们写好了获得变量长度的功能。
当bcp需要编译成bat的时候,软件会将头部(color、mode等命令)和代码,还有库文件中的定义都保存进bat去。。。
现在大家大概都明白了库文件的意思了吧。。。
(对,库文件就像C++的头文件一样,帮你把麻烦的事情做好,你需要用只需要一句#include就可以了。。。)
那么我的项目就是希望大家能帮忙编写多点库文件。。。
现在大概有四个类别的库文件:数组(想高级语言一样,伪数组)、计算(浮点运算)、字串(常用处理,获取长度等)、时间(加减、比较等)
现在请大家帮忙编写库文件。。。
库文件的格式如下:- 库文件版本
- 库文件作者
- 库文件所需要其他库文件的支持
- 使用库文件需要保留的内容
- 描述
- //**//
- 开始定义
复制代码
如果实在不懂,我附上我自己写的NewArray.bcl库文件,实现定义一个1~3维的数组:- 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
复制代码
那么请大家协助我完成库文件的编写!
(以下两张图,一个是头部的设置,一个是库文件的界面)
作者: 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里面了(外层引号自动处理)
- :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
复制代码
可是有两个字符还有麻烦:%、!
!号和%号在传递的时候被预处理掉了,其他符号就没问题了
如果实在没有办法,就用这个了
另外兄,帮忙写浮点运算。。。
作者: 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
初学批处理 也有楼主的一些想法 希望大家给点建议 下面的东西写了一整天喇复制代码
作者: 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 在数组里查找其中一个指定元素- 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$"
- 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$"
-
- 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$
复制代码
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$"
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]- 示例:
- 创建50个文件夹
- call :CreateArray array 50 %%%%i
- call :MapArray array "md $value[code]示例:
- 创建50个文件夹
- call :CreateArray array 50 %%%%i
- call :MapArray array "md $value$"
- 查找hello.txt文件中第二个hello
- call :CreateArray array 1 ""
- call :ReadArray array hello.txt
- call :FindArray array re 2 hello
- echo %re%
复制代码
quot;
查找hello.txt文件中第二个hello
call :CreateArray array 1 ""
call :ReadArray array hello.txt
call :FindArray array re 2 hello
echo %re%[/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
复制代码
搞定...回家睡睡~
作者: caruko 时间: 2009-12-3 14:08
数组不是批处理强项,要求效率以及复杂应用的还是用VBS,AUTOIT,PSHELL吧...
或者借助第三方工具..
[ 本帖最后由 caruko 于 2009-12-4 08:46 编辑 ]
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |