[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] assemble.bat 实现批处理集合运算

本帖最后由 dengyuli 于 2014-11-23 14:05 编辑

代码如下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. if "%1"=="/?" goto:usage
  4. if "%1"=="" goto:usage
  5. if "%1"=="/add" goto:add
  6. if "%1"=="/clr" goto:clr
  7. goto:calculate
  8. :add
  9. set ctr=0
  10. set "%3=%~2"
  11. set ctr%3=0
  12. for %%a in (%~2) do (
  13. set /a ctr+=1
  14. set /a ctr%3+=1
  15. for /l %%b in (!ctr!,1,!ctr!) do (
  16.   set %3%%b=%%a
  17. )
  18. )
  19. for /l %%a in (1,1,!ctr!) do (
  20. echo %3%%a^=!%3%%a!>>"!temp!\mash_vars"
  21. )
  22. echo %3^=!%3!>>"!temp!\mash_vars"
  23. echo ctr%3^=!ctr%3!>>"!temp!\mash_vars"
  24. endlocal
  25. for /f "delims=` tokens=* usebackq eol=" %%a in ("%temp%\mash_vars") do (
  26. set "%%a"
  27. )
  28. goto:eof
  29. :calculate
  30. if "%2"=="u" goto:unionset
  31. if "%2"=="n" goto:intsec
  32. if "%1"=="c" goto:compset
  33. if "%2"=="subset" goto:subset
  34. if "%2"=="prosub" goto:prosub
  35. goto:err
  36. :unionset
  37. for /f "delims=` tokens=* eol=" %%a in ('type "%temp%\mash_vars"') do (
  38. set "%%a"
  39. )
  40. set asd=0
  41. for /l %%a in (1,1,!ctr%1!) do (
  42. set %4%%a=!%1%%a!
  43. )
  44. set ctr=0
  45. rem ------------------he bing kai shi------------------
  46. set /a "cetac=!ctr%1!+1"
  47. set /a "ctr%4=!ctr%1!+!ctr%3!"
  48. for /l %%a in (!cetac!,1,!ctr%4!) do (
  49. set /a ctr+=1
  50. for /l %%b in (!ctr!,1,!ctr!) do (
  51.   set "%4%%a=!%3%%b!"
  52. )
  53. )
  54. for /l %%a in (1,1,!ctr%4!) do (
  55. set /a asd=%%a+1
  56. for /l %%b in (!asd!,1,!ctr%4!) do (
  57.   if "!%4%%a!"=="!%4%%b!" set "%4%%b="
  58. )
  59. )
  60. rem ------------------he bing jie shu-------------------
  61. set "%4=cskwofuniset"
  62. set /a "ctr%4=!ctr%1!+!ctr%3!"
  63. for /l %%a in (1,1,!ctr%4!) do (
  64. set "%4=!%4!,!%4%%a!"
  65. )
  66. set "t=!%4!"
  67. set "%4=!t:cskwofuniset,=!"
  68. set "t=!%4!"
  69. set "%4=!t:,,=,!"
  70. set "t=!%4!"
  71. set "%4=!t:,,=,!"
  72. set "t=!%4!"
  73. if "!t:~-1!"=="," set %4=!t:~0,-1!
  74. set "t=!%4!"
  75. set "%4=!t: =!"
  76. for /l %%a in (1,1,!ctr%4!) do (
  77. echo %4%%a=!%4%%a!>>"!temp!\mash_vars"
  78. )
  79. echo %4^=!%4!>>"!temp!\mash_vars"
  80. endlocal
  81. for /f "delims=` tokens=* usebackq eol=" %%a in ("%temp%\mash_vars") do (
  82. set "%%a"
  83. )
  84. goto:eof
  85. :intsec
  86. for /f "delims=` tokens=* usebackq eol=" %%a in ("!temp!\mash_vars") do (
  87. set "%%a"
  88. )
  89. set def=0
  90. for /l %%a in (1,1,!ctr%1!) do (
  91. for /l %%b in (1,1,!ctr%3!) do (
  92.   if "!%1%%a!"=="!%3%%b!" (
  93.    set /a def+=1
  94.    for /l %%c in (!def!,1,!def!) do (
  95.     set "%4%%c=!%1%%a!"
  96.    )
  97.   ) else (
  98.    break
  99.   )
  100. )
  101. )
  102. set %4=cskwofintsec
  103. set ctr%4=!def!
  104. for /l %%a in (1,1,!def!) do (
  105. set "%4=!%4!,!%4%%a!"
  106. )
  107. set t=!%4!
  108. set %4=!t:cskwofintsec,=!
  109. set t=!%4!
  110. set %4=!t: =!
  111. echo %4=!%4!>>"!temp!\mash_vars"
  112. for /l %%a in (1,1,!ctr%4!) do (
  113. echo %4%%a=!%4%%a!>>"!temp!\mash_vars"
  114. )
  115. endlocal
  116. for /f "delims=` tokens=* usebackq eol=" %%a in ("%temp%\mash_vars") do (
  117. set "%%a"
  118. )
  119. goto:eof
  120. :compset
  121. for /f "delims=` tokens=* usebackq eol=" %%a in ("!temp!\mash_vars") do (
  122. set "%%a"
  123. )
  124. for /l %%a in (1,1,!ctr%2!) do (
  125. set "%4%%a=!%2%%a!"
  126. )
  127. for /l %%a in (1,1,!ctr%3!) do (
  128. for /l %%b in (1,1,!ctr%2!) do (
  129.   if "!%3%%a!"=="!%2%%b!" set "%4%%b="
  130. )
  131. )
  132. set %4=cskwofcompset
  133. for /l %%a in (1,1,!ctr%2!) do (
  134. set "%4=!%4!,!%4%%a!"
  135. )
  136. set /a ctr%4=!ctr%2!-!ctr%3!
  137. set "t=!%4!"
  138. for /l %%a in (1,1,10) do (
  139. set "%4=!t:,,=,!"
  140. set "t=!%4!"
  141. )
  142. set %4=!t: =!
  143. set t=!%4!
  144. if "!t:~-1!"=="," set %4=!t:~0,-1!
  145. set t=!%4!
  146. set %4=!t:cskwofcompset,=!
  147. echo %4=!%4!>>"!temp!\mash_vars"
  148. for /l %%a in (1,1,!ctr%4!) do (
  149. echo %4%%a=!%4%%a!>>"!temp!\mash_vars"
  150. )
  151. echo ctr%4=!ctr%4!>>"!temp!\mash_vars"
  152. endlocal
  153. for /f "delims=` tokens=* usebackq eol=" %%a in ("%temp%\mash_vars") do (
  154. set "%%a"
  155. )
  156. goto:eof
  157. :subset
  158. for /f "delims=` tokens=* usebackq eol=" %%a in ("!temp!\mash_vars") do (
  159. set "%%a"
  160. )
  161. set ctr=0
  162. for /l %%a in (1,1,!ctr%1!) do (
  163. for /l %%b in (1,1,!ctr%3!) do (
  164.   if "!%1%%a!"=="!%3%%b!" set /a ctr+=1
  165. )
  166. )
  167. set t=!ctr!
  168. set u=!ctr%1!
  169. set ctr=!t: =!
  170. set ctr%1=!u: =!
  171. if !ctr!==!ctr%1! (
  172. set "result_%1sub%3=true"
  173. ) else (
  174. set "result_%1sub%3=false"
  175. )
  176. echo result_%1sub%3=!result_%1sub%3!>>"!temp!\mash_vars"
  177. endlocal
  178. for /f "delims=` tokens=* usebackq eol=" %%a in ("%temp%\mash_vars") do (
  179. set "%%a"
  180. )
  181. goto:eof
  182. :prosub
  183. for /f "delims=` tokens=* usebackq eol=" %%a in ("!temp!\mash_vars") do (
  184. set "%%a"
  185. )
  186. set ctr=0
  187. for /l %%a in (1,1,!ctr%1!) do (
  188. for /l %%b in (1,1,!ctr%3!) do (
  189.   if "!%1%%a!"=="!%3%%b!" set /a ctr+=1
  190. )
  191. )
  192. set t=!ctr!
  193. set u=!ctr%1!
  194. set v=!ctr%3!
  195. set ctr=!t: =!
  196. set ctr%1=!u: =!
  197. set ctr%3=!v: =!
  198. if !ctr!==!ctr%1! (
  199.      if !ctr%1! lss !ctr%3! (
  200.       set result_%1pro%3=true
  201.      ) else (
  202.       set result_%1pro%3=false
  203.      )
  204. ) else (
  205. set result_%1pro%3=false
  206. )
  207. echo result_%1pro%3=!result_%1pro%3!>>"!temp!\mash_vars"
  208. endlocal
  209. for /f "delims=` tokens=* usebackq eol=" %%a in ("%temp%\mash_vars") do (
  210. set "%%a"
  211. )
  212. goto:eof
  213. :clr
  214. del /f /q "!temp!\mash_vars" >nul
  215. goto:eof
  216. :usage
  217. echo=
  218. echo     %~nx0——集合运算器
  219. echo=
  220. echo     用法:%~nx0 ^/add [集合元素] [集合名称]
  221. echo           %~nx0 [集合名称1] [subset^|prosub] [集合名称2]
  222. echo           %~nx0 [集合名称1] [u^|n] [集合名称2] [集合名称3]
  223. echo           %~nx0 c [集合名称1] [集合名称2] [集合名称3]
  224. echo           %~nx0 ^/clr
  225. echo=
  226. echo           ^/add      添加一个集合,集合中各元素之间用英文逗号隔开,整个集合用
  227. echo                     双引号括起来,集合名称不能为以下的任意一个:
  228. echo                        subset   prosub   u   n   c   t   v
  229. echo=
  230. echo           ^/clr      清除所有的集合,当您退出程序之前,您应该使用此选项,
  231. echo                     否则下次程序启动时,上一次所添加的集合仍然可用,这
  232. echo                     可能会造成不可预料的错误!
  233. echo=
  234. echo                     各运算符的含义如下:
  235. echo=
  236. echo                     subset  判断前者是否是后者的子集,若是,则将变量
  237. echo                             result_[集合名称1]sub[集合名称2] 的值设为
  238. echo                             true,否则设为false
  239. pause>nul
  240. echo=
  241. echo                     prosub  判断前者是否是后者的真子集,若是,则将变量
  242. echo                             result_[集合名称1]pro[集合名称2] 的值设为
  243. echo                             true,否则设为false
  244. echo=
  245. echo                          u  求两个集合的并集,并添加[集合名称3],[集合名称3]
  246. echo                             中的元素是计算结果。
  247. echo=
  248. echo                          n  求两个集合的交集,并添加[集合名称3],[集合名称3]
  249. echo                             中的元素是计算结果。
  250. echo=
  251. echo                          c  求两个集合的补集,并添加[集合名称3],[集合名称3]
  252. echo                             中的元素是计算结果。
  253. echo=
  254. echo                     若要查看集合,则要输入echo [变量名],变量名为要查看的
  255. echo                     集合名称
  256. echo=
  257. goto:eof
复制代码
不知道在我之前有没有人做过这个?

返回列表