标题: 批处理面向对象框架2-类库 [打印本页]
作者: wrove 时间: 2012-11-1 12:50 标题: 批处理面向对象框架2-类库
本帖最后由 wrove 于 2012-11-2 01:28 编辑
11.@Array类:提供数组所需的所有功能
@Array:
Type "@Array"
==== ==================
Push 将一个元素添加到数组开头
Insert 添加一个元素到数组指定位置
Remove 删除指定索引位置上的元素
Append 添加一个元素到数组尾部
Extend 将另一个数组追加进原来的数组对象
===== ============================
Reserve 反转数组
ToString 回显数组的字符串表示
Delete 删除对象数据,解除方法绑定
12.@String类:提供字符串所需的所有功能
@String:
Length 返回字符串长度
====== ====================================
Replace 搜索并用某字符串替换当前字符串中搜索到的字符串
Split 分割字符串,仿效VB的Split函数
Join 向传入的数组中插入当前字符串对象的字符串,仿效C#的Join
Reverse 返回反转后的字符串
====== ====================================
PadLeft 左填充字符串
PadRight 右填充字符串
====== ====================================
Insert 在指定索引位置插入传入的字符串
Remove 删除此字符串从指定位置起一定数目的字符
IndexOf 返回传入字符串在当前字符串对象的字符串中的位置,如果没找到,返回-1
Slice 分片字符串,参数为:起索引、止索引、步长
StartsWith 判断字符串是否以传入的字符串开头,这个功能只用内部调用IndexOf即可
EndsWith 判断字符串是否以传入的字符串结尾
====== ====================================
TrimLeft 删除当前字符串左边空白字符串,如果有参数则删除左边参数指定的字符串
Trim 删除当前字符串两端空白字符串,如果有参数则删除两端参数指定的字符串
TrimRight 删除当前字符串右边空白字符串,如果有参数则删除右边参数指定的字符串
====== ====================================
Title 返回标题格式的字符串
ToUpper 返回当前字符串的大写形式
ToLower 返回当前字符串的小写形式
====== ====================================
ToChars 返回当前字符串的字符数组
13.@Math类:
@Math:
Add 加法
Sub 减法
Multiply 乘法
Divide 除法
Power 求幂
14.@File类:
@File:
Size 返回文件大小,字节为单位
CreateTime 返回文件创建时间
ModifyTime 返回文件上次修改时间
AccessTime 返回文件上次访问时间
Attribute 返回文件属性
Folder 所在目录
BaseName 文件基本名
ExtensionName 文件扩展名
ShortName 文件的短名称
====== ===================================
CopyTo 将文件复制到指定位置,可以附带重命名
Rename 重命名文件
Move 将文件移动到指定位置,可以附带重命名
Delete 删除文件
Show 简单分屏显示文件内容
FileInfo 格式良好地回显文件信息
SetAttribute 设置文件属性,简单传入修改时attrib后面的字符串
15.@Folder类:提供目录相关功能
@Folder:
Size 返回目录大小,字节为单位
CreateTime 返回目录创建时间
ModifyTime 返回目录上次修改时间
AccessTime 返回目录上次访问时间
Attribute 返回目录属性
Folder 所在目录
BaseName 目录基本名
ShortName 目录的短名称
====== ===================================
CopyTo 将目录复制到指定位置,可以附带重命名
Rename 重命名目录
Move 将目录移动到指定位置,可以附带重命名
Delete 删除目录
FileInfo 格式良好地回显目录信息
SetAttribute 设置目录属性,简单传入修改时attrib后面的字符串
作者: wrove 时间: 2012-11-1 13:01
本帖最后由 wrove 于 2012-11-2 08:56 编辑
- @Echo off&SetLocal EnableDelayedExpansion&Color a
- Echo 0.创建一个数组$days,给它赋予周一到周五的工作日名称
- Call :@Array "$days" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday"
- Echo.
- Call :%$days.ToString%
- Echo.
- Echo 1.在数组$days开始位置压入一个元素"Sunday"
- Call :%$days.Push% "Sunday"
- Echo.
- Call :%$days.ToString%
- Echo.
- Echo 2.插入"Hello World"到数组$days的第3索引位置
- Call :%$days.Insert% 3 "Hello World"
- Echo.
- Call :%$days.ToString%
- Echo.
- Echo 3.删除数组$days的第3索引位置上的元素
- Call :%$days.Remove% 3
- Echo.
- Call :%$days.ToString%
- Echo.
- Echo 4.在数组$days的末尾位置追加一个元素"Saturday"
- Call :%$days.Append% "Saturday"
- Echo.
- Call :%$days.ToString%
- Echo.
- Echo 5.在数组$days的末尾追加另一个数组$Signs
- Echo.
- ECho 5.1创建数组$Signs,给它添加两个元素"+"、"-"
- Echo.
- Call :@Array "$Signs" "+" "-"
- Echo 5.2回显数组$Signs的信息
- Echo.
- Call :%$Signs.ToString%
- Echo.
- Echo 5.3将$Signs的所有元素追加到$days末尾
- Call :%$days.Extend% "$Signs"
- Echo.
- Echo 5.4回显追加$Signs数组后$days数组的信息
- Echo.
- Call :%$days.ToString%
- Echo.
- Echo 6.反转$days数组的元素
- Call :%$days.Reserve%
- Echo.
- Call :%$days.ToString%
- Echo.
- Echo 9.删除数组$days的数据与方法
- Call :%$days.Delete%
- Echo =================All Done==================
- Echo Press any key to quit...
- Pause>nul
- Exit
-
-
- Rem =================@Array====================
- :@Array
- Rem 初始化临时变量
- Set __this=%~1
- Set __index=-1
- :Array_Begin
- Rem 第一次调用建立类型固有信息
- If not Defined $Array.Methods (
- Set $Array.Fields="Type UBound [i]"
- Set $Array.Methods="Push Insert Remove Append Extend Reserve ToString Delete"
- )
- Rem *******************************************
- Rem 初始化对象字段
- Rem 设置对象的类型信息
- Set %__this%.Type="@Array"
- Rem 设置数组元素
- For %%a In (%*) Do (
- Set %__this%[!__index!]=%%a
- Set /a __index+=1
- )
- Rem 删除无用的数组元素,即位于-1索引位置的元素
- Set %__this%[-1]=
- Rem 设置数组的最大下标
- Set /a %__this%.UBound=%__index%-1
- Rem *******************************************
- Rem 初始化对象方法
- For %%a In (%$Array.Methods:"=%) Do (
- Set %__this%.%%a=Array.%%a %__this%
- )
- Rem *******************************************
- :Array_End
- Rem 销毁临时变量
- Set __this=
- Set __index=
- Goto :Eof
- Rem -------------------------------------------
-
- Rem -------------------------------------------
- :Array.Push
- Rem 初始化临时变量
- Set __this=%~1
- Set /a __index=!%__this%.UBound!+1
- :Array.Push_Begin
- Rem *******************************************
- For /L %%a In (!%__this%.UBound!,-1,0) Do (
- Set %__this%[!__index!]=!%__this%[%%a]!
- Set /a __index-=1
- )
- Set /a %__this%.UBound+=1
- Set %__this%[0]=%2
- Rem *******************************************
- :Array.Push_End
- Rem 销毁临时变量
- Set __this=
- Set __index=
- Goto :Eof
- Rem -------------------------------------------
-
- Rem -------------------------------------------
- :Array.Insert
- Rem 初始化临时变量
- Set __this=%~1
- Set /a __index=!%__this%.UBound!+1
- :Array.Insert_Begin
- Rem *******************************************
- For /L %%a In (!%__this%.UBound!,-1,%~2) Do (
- Set %__this%[!__index!]=!%__this%[%%a]!
- Set /a __index-=1
- )
- Set %__this%[%~2]=%3
- Set /a %__this%.UBound+=1
- Rem *******************************************
- :Array.Insert_End
- Rem 销毁临时变量
- Set __this=
- Set __index=
- Goto :Eof
- Rem -------------------------------------------
-
- Rem -------------------------------------------
- :Array.Remove
- Rem 初始化临时变量
- Set __this=%~1
- Set __index=%~2
- Set /a __Start=%~2+1
- :Array.Remove_Begin
- Rem *******************************************
- For /L %%a In (%__Start%,1,!%__this%.UBound!) Do (
- Set %__this%[!__index!]=!%__this%[%%a]!
- Set /a __index+=1
- )
- Set /a %__this%.UBound-=1
- Rem *******************************************
- :Array.Remove_End
- Rem 销毁临时变量
- Set __this=
- Set __index=
- Set __Start=
- Goto :Eof
- Rem -------------------------------------------
-
- Rem -------------------------------------------
- :Array.Append
- Rem 初始化临时变量
- Set __this=%~1
- :Array.Append_Begin
- Rem *******************************************
- Set /a %__this%.UBound+=1
- Set %__this%[!%__this%.UBound!]=%2
- Rem *******************************************
- :Array.Append_End
- Rem 销毁临时变量
- Set __this=
- Goto :Eof
- Rem -------------------------------------------
-
- Rem -------------------------------------------
- :Array.Extend
- Rem 初始化临时变量
- Set __this=%~1
- Set __OtherObj=%~2
- If not !%__OtherObj%.Type!=="@Array" (
- Echo Error:要求参数%__OtherObj%是一个数组
- )
- Set /a __index=!%__this%.UBound!+1
- :Array.Extend_Begin
- Rem *******************************************
- For /L %%a In (0,1,!%__OtherObj%.UBound!) Do (
- Set %__this%[!__index!]=!%__OtherObj%[%%a]!
- Set /a __index+=1
- )
- Set /a %__this%.UBound+=!%__OtherObj%.UBound!+1
- Rem *******************************************
- :Array.Extend_End
- Rem 销毁临时变量
- Set __this=
- Set __OtherObj=
- Set __index=
- Goto :Eof
- Rem -------------------------------------------
-
- Rem -------------------------------------------
- :Array.Reserve
- Rem 初始化临时变量
- Set __this=%~1
- Set /a __LEnd=!%__this%.UBound!/2
- Set /a __Mod=!%__this%.UBound!%2
- If %__Mod% equ 0 (
- Set /a __LEnd=%__LEnd%-1
- )
- Set __RIndex=!%__this%.UBound!
- :Array.Reserve_Begin
- Rem *******************************************
- For /L %%a In (0,1,%__LEnd%) Do (
- Set __Temp=!%__this%[%%a]!
- Call Set %__this%[%%a]=%%%__this%[!__RIndex!]%%
- Set %__this%[!__RIndex!]=!__Temp!
- Set /a __RIndex-=1
- )
- Rem *******************************************
- :Array.Reserve_End
- Rem 销毁临时变量
- Set __this=
- Set __LEnd=
- Set __Mod=
- Set __RIndex=
- Set __Temp=
- Goto :Eof
- Rem -------------------------------------------
-
- Rem -------------------------------------------
- :Array.ToString
- Rem 初始化临时变量
- Set __this=%~1
- Set __Str=[
- :Array.ToString_Begin
- Rem *******************************************
- For /L %%a In (0,1,!%__this%.UBound!) Do Set __Str=!__Str!!%__this%[%%a]!,
- Set __Str=%__Str:~,-1%]
- Echo %__Str%
- Rem *******************************************
- Rem 销毁临时变量
- :Array.ToString_End
- Set __this=
- Set __Str=
- Goto :Eof
- Rem -------------------------------------------
-
- Rem -------------------------------------------
- :Array.Delete
- Rem 初始化临时变量
- Set __this=%~1
- :Array.Delete_Begin
- Rem *******************************************
- Rem 删除对象的数据
- Rem 删除对象类型信息
- Set %__this%.Type=
- Rem 删除数组元素
- For /L %%a In (0,1,!%__this%.UBound!) Do (
- Set %__this%[%%a]=
- )
- Set %__this%=
- Rem 删除对象的方法
- For %%a In (%$Array.Methods:"=%) Do (
- Set %__this%.%%a=
- )
- Rem *******************************************
- :Array.Delete_End
- Rem 销毁临时变量
- Set __this=
- Goto :Eof
- Rem =================@Array====================
复制代码
作者: wrove 时间: 2012-11-1 21:54
本帖最后由 wrove 于 2012-11-2 08:37 编辑
以上面这个@Array类为例,对框架作一下简要说明:
1.所有类以@ClassName格式命名,如上
2.所有类在第一个此类的对象被创建之前会创建一个$ClassName.Methods和$ClassName.Fields
变量,用于保存这个类的方法成员,它们以“.MethodName”的形式连接成一个字符串,如上面的:
Set $Array.Methods="Push Insert Remove Append Extend Reserve ToString Delete"
3.当创建对象之前,首先给这个对象添加一个Type属性,它简单地保存此对象所属的类型信息,如:
Set %__this%.Type="@Array"
可以使用if string1==string2的方法来校验类型,如上面的:
If not !%__OtherObj%.Type!=="@Array" (
Echo Error:要求参数%__OtherObj%是一个数组
)
4.而后是初始化对象数据,上面的这个是个数组类,所以我们用
(1)数组$ArrayName.UBound字段保存数组最大下标
(2)$ArrayName[n]保存数组元素,其中n为自然数,索引从0开始
对象类型不同数据的储存方式也会不同,仅以上面的类为例
5.而后是给对象绑定方法,这时候$ClassName.Methods就用上了,我们从中解析出所有的Method
并将MethodName与$ObjName绑定,如:
$days.Push=Array.Push $days
$days.Insert=Array.Insert $days
... ...
$days.Delete=Array.Delete $days
这样绑定之后,我们就可以按如下方式调用方法:
Call :%$ObjName.MethodName% arg1 arg2 arg3 ...
这与面向对象的写法很接近,如果我们想从方法中带回值,可以简单地使用$ObjName.MethodName
作为结果的载体来返回结果,当然要注意在方法
开始的地方将上次的调用结果清空,这个很重要
6.而后要注意的就是Delete方法,它会按对象数据存储的顺序,将所有的数据清除,包括对象的类型信息,
对象的所有数据,对象的方法绑定,还有方法的结果载体,因为方法的结果要留着访问的,所以在方法
退出之时,结果载体应该被设置为此次调用结果,而不是被清除,所以清理工作就得由Delete来做,
当然,你不做,系统也会做
7.总体而言我们的代价是较大的内存花销与一定的效率损失,不过就它会在开发效率(我实在不想这么说,
因为不觉得什么样的批处理编写能称得上是开发,规模通常太小)上得到补偿
作者: wrove 时间: 2012-11-2 02:18
本帖最后由 wrove 于 2012-11-2 03:01 编辑
一楼除@Array类之外,其他的类接口有很多需要添加元素,比如Type属性、Delete方法、ToString方法,
有兴趣的可以依照2楼的@Array的定义,给予补全,并实现
另外,还有Drive、TextDB(文本数据库)、DataTime、Process、WinRAR
有兴趣的,可以一起探讨探讨一下,呵呵;
这个框架的初衷,只是提供另一种编写批处理的选择:面向对象,让一切更简单(对人而
作者: wrove 时间: 2012-11-2 10:51
- Echo ================@Array2测试================
- Echo.
- Echo @Array2类继承@Array类,添加InsertStr方法
- Echo.
- Echo 0.创建@Array2类型的新数组$Direction
- Call :@Array2 "$Direction" "East" "West" "South" "North"
- Echo.
- Echo 1.调用继承而来的ToString方法,回显此数组
- Echo.
- Call :%$Direction.ToString%
- Echo.
- Echo 2.$Direction.Type=%$Direction.Type%
- Echo.
- Echo 3.调用添加的方法InsertStr
- Call :%$Direction.InsertStr% "+"
- Echo.
- Echo 4.通过访问$Direction.InsertStr.Return回显调用结果
- Echo.
- Echo %$Direction.InsertStr.Return%
- Echo.
- Echo 5.删除对象$Direction
- Call :%$Direction.Delete%
- Echo =================All Done==================
- Echo Press any key to quit...
- Pause>nul
- Exit
-
-
- Rem =================@Array2====================
- :@Array2
- Rem 调用基类
- Call :@Array %*
- Rem 为Array类多提供一个InsertStr功能
- Set __this=%~1
- :Array2_Begin
- Rem 第一次调用建立类型固有信息
- If not Defined $Array2.Methods (
- Set $Array2.Methods="InsertStr Delete"
- )
- Rem *******************************************
- Rem 初始化对象字段
- Rem 设置对象的类型信息
- Set %__this%.Type="@Array2"
- Rem *******************************************
- Rem 初始化对象方法
- For %%a In (%$Array2.Methods:"=%) Do (
- Set %__this%.%%a=Array2.%%a %__this%
- )
- Rem *******************************************
- :Array2_End
- Rem 销毁临时变量
- Set __this=
- Set __index=
- Goto :Eof
- Rem -------------------------------------------
-
- Rem -------------------------------------------
- :Array2.InsertStr
- Rem 初始化临时变量
- Set __this=%~1
- Set __StrToInsert=%2
- Set %__this%.InsertStr.Return=
- :Array2.InsertStr_Begin
- Rem *******************************************
- For /L %%a In (0,1,!%__this%.UBound!) Do (
- If %%a equ !%__this%.UBound! (
- Set %__this%.InsertStr.Return=!%__this%.InsertStr.Return!!%__this%[%%a]:"=!
- ) Else (
- Set %__this%.InsertStr.Return=!%__this%.InsertStr.Return!!%__this%[%%a]:"=!%__StrToInsert:"=%
- )
- )
- Rem *******************************************
- :Array2.InsertStr_End
- Rem 销毁临时变量
- Set __this=
- Set __StrToInsert=
- Goto :Eof
- Rem -------------------------------------------
-
- Rem -------------------------------------------
- :Array2.Delete
- Call :Array.Delete %*
- Set __this=%~1
- :Array2.Delete_Begin
- For %%a In (%$Array2.Methods:"=%) Do (
- Set %__this%.%%a=
- )
- Rem 删除方法返回值
- Set %__this%.InsertStr.Return=
- :Array2.Delete_End
- Set __this=
- Rem =================@Array2====================
复制代码
加上@Array的代码,实现继承
作者: caruko 时间: 2012-11-14 15:26
本帖最后由 caruko 于 2012-11-14 15:27 编辑
每个类,进入的时候调用一次setlocal ,结束时调用endlocal,不就可以销毁变量?
而且也不会修改外部变量,还不会受到外部大量变量带来的速度影响。
唯一麻烦的是修改全局变量。
作者: wrove 时间: 2012-11-15 00:18
嗯,这个机制我还是第一次了解,不过的确,这里创建对象,总要将对象字段方法这些在全局暴露出来
否则那跟什么也不做有什么区别
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |