Board logo

标题: 批处理面向对象框架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 编辑
  1. @Echo off&SetLocal EnableDelayedExpansion&Color a
  2. Echo 0.创建一个数组$days,给它赋予周一到周五的工作日名称
  3. Call :@Array "$days" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday"
  4. Echo.
  5. Call :%$days.ToString%
  6. Echo.
  7. Echo 1.在数组$days开始位置压入一个元素"Sunday"
  8. Call :%$days.Push% "Sunday"
  9. Echo.
  10. Call :%$days.ToString%
  11. Echo.
  12. Echo 2.插入"Hello World"到数组$days的第3索引位置
  13. Call :%$days.Insert% 3 "Hello World"
  14. Echo.
  15. Call :%$days.ToString%
  16. Echo.
  17. Echo 3.删除数组$days的第3索引位置上的元素
  18. Call :%$days.Remove% 3
  19. Echo.
  20. Call :%$days.ToString%
  21. Echo.
  22. Echo 4.在数组$days的末尾位置追加一个元素"Saturday"
  23. Call :%$days.Append% "Saturday"
  24. Echo.
  25. Call :%$days.ToString%
  26. Echo.
  27. Echo 5.在数组$days的末尾追加另一个数组$Signs
  28. Echo.
  29. ECho 5.1创建数组$Signs,给它添加两个元素"+"、"-"
  30. Echo.
  31. Call :@Array "$Signs" "+" "-"
  32. Echo 5.2回显数组$Signs的信息
  33. Echo.
  34. Call :%$Signs.ToString%
  35. Echo.
  36. Echo 5.3将$Signs的所有元素追加到$days末尾
  37. Call :%$days.Extend% "$Signs"
  38. Echo.
  39. Echo 5.4回显追加$Signs数组后$days数组的信息
  40. Echo.
  41. Call :%$days.ToString%
  42. Echo.
  43. Echo 6.反转$days数组的元素
  44. Call :%$days.Reserve%
  45. Echo.
  46. Call :%$days.ToString%
  47. Echo.
  48. Echo 9.删除数组$days的数据与方法
  49. Call :%$days.Delete%
  50. Echo =================All Done==================
  51. Echo Press any key to quit...
  52. Pause>nul
  53. Exit
  54. Rem =================@Array====================
  55. :@Array
  56. Rem 初始化临时变量
  57. Set __this=%~1
  58. Set __index=-1
  59. :Array_Begin
  60. Rem 第一次调用建立类型固有信息
  61. If not Defined $Array.Methods (
  62. Set $Array.Fields="Type UBound [i]"
  63. Set $Array.Methods="Push Insert Remove Append Extend Reserve ToString Delete"
  64. )
  65. Rem *******************************************
  66. Rem 初始化对象字段
  67. Rem 设置对象的类型信息
  68. Set %__this%.Type="@Array"
  69. Rem 设置数组元素
  70. For %%a In (%*) Do (
  71. Set %__this%[!__index!]=%%a
  72. Set /a __index+=1
  73. )
  74. Rem 删除无用的数组元素,即位于-1索引位置的元素
  75. Set %__this%[-1]=
  76. Rem 设置数组的最大下标
  77. Set /a %__this%.UBound=%__index%-1
  78. Rem *******************************************
  79. Rem 初始化对象方法
  80. For %%a In (%$Array.Methods:"=%) Do (
  81. Set %__this%.%%a=Array.%%a %__this%
  82. )
  83. Rem *******************************************
  84. :Array_End
  85. Rem 销毁临时变量
  86. Set __this=
  87. Set __index=
  88. Goto :Eof
  89. Rem -------------------------------------------
  90. Rem -------------------------------------------
  91. :Array.Push
  92. Rem 初始化临时变量
  93. Set __this=%~1
  94. Set /a __index=!%__this%.UBound!+1
  95. :Array.Push_Begin
  96. Rem *******************************************
  97. For /L %%a In (!%__this%.UBound!,-1,0) Do (
  98. Set %__this%[!__index!]=!%__this%[%%a]!
  99. Set /a __index-=1
  100. )
  101. Set /a %__this%.UBound+=1
  102. Set %__this%[0]=%2
  103. Rem *******************************************
  104. :Array.Push_End
  105. Rem 销毁临时变量
  106. Set __this=
  107. Set __index=
  108. Goto :Eof
  109. Rem -------------------------------------------
  110. Rem -------------------------------------------
  111. :Array.Insert
  112. Rem 初始化临时变量
  113. Set __this=%~1
  114. Set /a __index=!%__this%.UBound!+1
  115. :Array.Insert_Begin
  116. Rem *******************************************
  117. For /L %%a In (!%__this%.UBound!,-1,%~2) Do (
  118. Set %__this%[!__index!]=!%__this%[%%a]!
  119. Set /a __index-=1
  120. )
  121. Set %__this%[%~2]=%3
  122. Set /a %__this%.UBound+=1
  123. Rem *******************************************
  124. :Array.Insert_End
  125. Rem 销毁临时变量
  126. Set __this=
  127. Set __index=
  128. Goto :Eof
  129. Rem -------------------------------------------
  130. Rem -------------------------------------------
  131. :Array.Remove
  132. Rem 初始化临时变量
  133. Set __this=%~1
  134. Set __index=%~2
  135. Set /a __Start=%~2+1
  136. :Array.Remove_Begin
  137. Rem *******************************************
  138. For /L %%a In (%__Start%,1,!%__this%.UBound!) Do (
  139. Set %__this%[!__index!]=!%__this%[%%a]!
  140. Set /a __index+=1
  141. )
  142. Set /a %__this%.UBound-=1
  143. Rem *******************************************
  144. :Array.Remove_End
  145. Rem 销毁临时变量
  146. Set __this=
  147. Set __index=
  148. Set __Start=
  149. Goto :Eof
  150. Rem -------------------------------------------
  151. Rem -------------------------------------------
  152. :Array.Append
  153. Rem 初始化临时变量
  154. Set __this=%~1
  155. :Array.Append_Begin
  156. Rem *******************************************
  157. Set /a %__this%.UBound+=1
  158. Set %__this%[!%__this%.UBound!]=%2
  159. Rem *******************************************
  160. :Array.Append_End
  161. Rem 销毁临时变量
  162. Set __this=
  163. Goto :Eof
  164. Rem -------------------------------------------
  165. Rem -------------------------------------------
  166. :Array.Extend
  167. Rem 初始化临时变量
  168. Set __this=%~1
  169. Set __OtherObj=%~2
  170. If not !%__OtherObj%.Type!=="@Array" (
  171. Echo Error:要求参数%__OtherObj%是一个数组
  172. )
  173. Set /a __index=!%__this%.UBound!+1
  174. :Array.Extend_Begin
  175. Rem *******************************************
  176. For /L %%a In (0,1,!%__OtherObj%.UBound!) Do (
  177. Set %__this%[!__index!]=!%__OtherObj%[%%a]!
  178. Set /a __index+=1
  179. )
  180. Set /a %__this%.UBound+=!%__OtherObj%.UBound!+1
  181. Rem *******************************************
  182. :Array.Extend_End
  183. Rem 销毁临时变量
  184. Set __this=
  185. Set __OtherObj=
  186. Set __index=
  187. Goto :Eof
  188. Rem -------------------------------------------
  189. Rem -------------------------------------------
  190. :Array.Reserve
  191. Rem 初始化临时变量
  192. Set __this=%~1
  193. Set /a __LEnd=!%__this%.UBound!/2
  194. Set /a __Mod=!%__this%.UBound!%2
  195. If %__Mod% equ 0 (
  196. Set /a __LEnd=%__LEnd%-1
  197. )
  198. Set __RIndex=!%__this%.UBound!
  199. :Array.Reserve_Begin
  200. Rem *******************************************
  201. For /L %%a In (0,1,%__LEnd%) Do (
  202. Set __Temp=!%__this%[%%a]!
  203. Call Set %__this%[%%a]=%%%__this%[!__RIndex!]%%
  204. Set %__this%[!__RIndex!]=!__Temp!
  205. Set /a __RIndex-=1
  206. )
  207. Rem *******************************************
  208. :Array.Reserve_End
  209. Rem 销毁临时变量
  210. Set __this=
  211. Set __LEnd=
  212. Set __Mod=
  213. Set __RIndex=
  214. Set __Temp=
  215. Goto :Eof
  216. Rem -------------------------------------------
  217. Rem -------------------------------------------
  218. :Array.ToString
  219. Rem 初始化临时变量
  220. Set __this=%~1
  221. Set __Str=[
  222. :Array.ToString_Begin
  223. Rem *******************************************
  224. For /L %%a In (0,1,!%__this%.UBound!) Do Set __Str=!__Str!!%__this%[%%a]!,
  225. Set __Str=%__Str:~,-1%]
  226. Echo %__Str%
  227. Rem *******************************************
  228. Rem 销毁临时变量
  229. :Array.ToString_End
  230. Set __this=
  231. Set __Str=
  232. Goto :Eof
  233. Rem -------------------------------------------
  234. Rem -------------------------------------------
  235. :Array.Delete
  236. Rem 初始化临时变量
  237. Set __this=%~1
  238. :Array.Delete_Begin
  239. Rem *******************************************
  240. Rem 删除对象的数据
  241. Rem 删除对象类型信息
  242. Set %__this%.Type=
  243. Rem 删除数组元素
  244. For /L %%a In (0,1,!%__this%.UBound!) Do (
  245. Set %__this%[%%a]=
  246. )
  247. Set %__this%=
  248. Rem 删除对象的方法
  249. For %%a In (%$Array.Methods:"=%) Do (
  250. Set %__this%.%%a=
  251. )
  252. Rem *******************************************
  253. :Array.Delete_End
  254. Rem 销毁临时变量
  255. Set __this=
  256. Goto :Eof
  257. 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

  1. Echo ================@Array2测试================
  2. Echo.
  3. Echo @Array2类继承@Array类,添加InsertStr方法
  4. Echo.
  5. Echo 0.创建@Array2类型的新数组$Direction
  6. Call :@Array2 "$Direction" "East" "West" "South" "North"
  7. Echo.
  8. Echo 1.调用继承而来的ToString方法,回显此数组
  9. Echo.
  10. Call :%$Direction.ToString%
  11. Echo.
  12. Echo 2.$Direction.Type=%$Direction.Type%
  13. Echo.
  14. Echo 3.调用添加的方法InsertStr
  15. Call :%$Direction.InsertStr% "+"
  16. Echo.
  17. Echo 4.通过访问$Direction.InsertStr.Return回显调用结果
  18. Echo.
  19. Echo %$Direction.InsertStr.Return%
  20. Echo.
  21. Echo 5.删除对象$Direction
  22. Call :%$Direction.Delete%
  23. Echo =================All Done==================
  24. Echo Press any key to quit...
  25. Pause>nul
  26. Exit
  27. Rem =================@Array2====================
  28. :@Array2
  29. Rem 调用基类
  30. Call :@Array %*
  31. Rem 为Array类多提供一个InsertStr功能
  32. Set __this=%~1
  33. :Array2_Begin
  34. Rem 第一次调用建立类型固有信息
  35. If not Defined $Array2.Methods (
  36. Set $Array2.Methods="InsertStr Delete"
  37. )
  38. Rem *******************************************
  39. Rem 初始化对象字段
  40. Rem 设置对象的类型信息
  41. Set %__this%.Type="@Array2"
  42. Rem *******************************************
  43. Rem 初始化对象方法
  44. For %%a In (%$Array2.Methods:"=%) Do (
  45. Set %__this%.%%a=Array2.%%a %__this%
  46. )
  47. Rem *******************************************
  48. :Array2_End
  49. Rem 销毁临时变量
  50. Set __this=
  51. Set __index=
  52. Goto :Eof
  53. Rem -------------------------------------------
  54. Rem -------------------------------------------
  55. :Array2.InsertStr
  56. Rem 初始化临时变量
  57. Set __this=%~1
  58. Set __StrToInsert=%2
  59. Set %__this%.InsertStr.Return=
  60. :Array2.InsertStr_Begin
  61. Rem *******************************************
  62. For /L %%a In (0,1,!%__this%.UBound!) Do (
  63. If %%a equ !%__this%.UBound! (
  64. Set %__this%.InsertStr.Return=!%__this%.InsertStr.Return!!%__this%[%%a]:"=!
  65. ) Else (
  66. Set %__this%.InsertStr.Return=!%__this%.InsertStr.Return!!%__this%[%%a]:"=!%__StrToInsert:"=%
  67. )
  68. )
  69. Rem *******************************************
  70. :Array2.InsertStr_End
  71. Rem 销毁临时变量
  72. Set __this=
  73. Set __StrToInsert=
  74. Goto :Eof
  75. Rem -------------------------------------------
  76. Rem -------------------------------------------
  77. :Array2.Delete
  78. Call :Array.Delete %*
  79. Set __this=%~1
  80. :Array2.Delete_Begin
  81. For %%a In (%$Array2.Methods:"=%) Do (
  82. Set %__this%.%%a=
  83. )
  84. Rem 删除方法返回值
  85. Set %__this%.InsertStr.Return=
  86. :Array2.Delete_End
  87. Set __this=
  88. 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