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

额 还有 那个…… 你觉得做个 计算分数运算的函数怎么样

不进行四舍五入 得到的答案如果非整数就用分数表示

表个态 我觉得这挺有趣的,可能另外发帖讨论。

TOP

这个难度太高了,涉及约分、最简分数等,而且繁分数还要一起返回括号?

小数的问题处理完了,作为一个单独的高难度专题来讨论编写。。。

TOP

若是来上一句类似于#include的语句,感觉只有改变批处理的运行机制才行。 实在想不出批处理该如何调用其他文件中的函数,或许是因为脑子少根弦想象不到。若是先在自身中找函数,若找不到就到库文件中找,其中是否会涉及到函数名重复及效率的问题。感觉有好多障碍,拭目以待~
心绪平和,眼藏静谧。

TOP

哈哈,楼上想复杂了。。。

如果我能够改变批处理的运行机制的话,那就强大了。。。

TOP

你能原创一个脚本形式 或者平台 那才爽……  OMG 全论坛人都会支持的……

TOP

这个难度太高了。。。

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

结果后来解释器不能操作变量,貌似system函数对set无爱,结果就放弃了。。。

TOP

用新的脚本形式和平台前提就是有一个好的解释器。。。

批处理的解释器都不行,脚本形式和平台就更无可能了。。。

TOP

推荐看下PE系统的PECMD.exe,功能比较强大,呵呵
当一个人不断追问的时候,其实就已经对自己产生了怀疑

TOP

@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

TOP

回复 24楼 的帖子

感谢提供,不过貌似库里已经有一个减法的了。。。
第三方命令行工具编程
Http://Hi.Baidu.Com/Console_App

TOP

初学批处理 也有楼主的一些想法 希望大家给点建议 下面的东西写了一整天喇
  1. @echo off
  2. setlocal Enabledelayedexpansion
  3. ::例如去某文本含有字符0的行并赋值给KK
  4. ::得到的值将寄存在KK1~ KK0为数组总个数
  5. call :G_getstrrow 0 a.txt kk
  6. echo %kk1%
  7. echo %kk0%
  8. pause
  9. exit
  10. ::1.取文本行中指定的第N行 G_getrowstr 行数 文本 返回寄存变量
  11. ::2.取文本的总行数 G_getrows 文本 返回寄存变量
  12. ::3.合并多个字符串字符串 G_mergestr 返回寄存变量 字符串1 字符串2 ...
  13. ::4.将某字符串插入某文本尾部 G_inserttail 文本 字符串1 字符串2 ...
  14. ::5.统计文本长度G_counttxt 文本 返回长度变量
  15. ::6.统计变量长度G_countstr 变量 返回长度
  16. ::7.取文本出现行G_getstrrow 字符串 文本 寄存 (返回数组总个数保存
  17. 在0位)
  18. ::7
  19. :G_getstrrow
  20. set G_getstrrowsum=
  21. set G_getstrrowtmp=
  22. set G_getstrrowtmps=
  23. set G_getstrrows=%3
  24. for /f "delims=" %%i in ('findstr "%1" %2') do (
  25. set /a "G_getstrrowsum+=1"
  26. set G_getstrrowtmp=%%i
  27. call :G_mergestr getstrrowtmpa %G_getstrrows% !G_getstrrowsum!
  28. call :G_getstrrow_set !getstrrowtmpa!
  29. )
  30. set %G_getstrrows%0=!G_getstrrowsum!
  31. set G_getstrrows=
  32. set G_getstrrowtmp=
  33. set G_getstrrowtmps=
  34. goto :eof
  35. :G_getstrrow_set
  36. set G_getstrrowtmps=%1
  37. set %G_getstrrowtmps%=!G_getstrrowtmp!
  38. goto :eof
  39. ::6
  40. :G_countstr
  41. set G_string=%1
  42. set G_countstr=%2
  43. :G_countstrstart
  44. if not "%G_string%"=="" (
  45. set /a %G_countstr%+=1
  46. set "G_string=%G_string:~1%"
  47. goto G_countstrstart
  48. )
  49. set G_string=
  50. set G_countstr=
  51. goto :eof
  52. ::5
  53. :G_counttxt
  54. set G_counttxt=
  55. set G_count=%2
  56. for /f "delims=" %%i in (%1) do set G_counttxt=!G_counttxt!%%i
  57. :G_counttxtstart
  58. if not "%G_counttxt%"=="" (
  59. set /a %G_count%+=1
  60. set "G_counttxt=%G_counttxt:~1%"
  61. goto G_counttxtstart
  62. )
  63. set G_count=
  64. set G_counttxt=
  65. goto :eof
  66. ::1
  67. :G_getrowstr
  68. set %3=
  69. for /f "skip=%1 delims=" %%i in (%2) do (
  70. set %3=%%i
  71. goto :eof
  72. )
  73. ::2
  74. :G_getrows
  75. set %2=0
  76. for /f %%i in ('findstr /n .* %1') do (
  77. set /a %2=%2+1
  78. )
  79. goto :eof
  80. ::3
  81. :G_mergestr
  82. set G_mergestr=%1
  83. :G_getstr
  84. if "%2"=="" goto mergestrend
  85. set G_mergestrs=%G_mergestrs%%2
  86. shift /2
  87. goto G_getstr
  88. :mergestrend
  89. set %G_mergestr%=%G_mergestrs%
  90. set G_mergestrs=
  91. goto :eof
  92. ::4
  93. :G_inserttail
  94. set G_inserttailtxt=%1
  95. :getG_inserttail
  96. if "%2"=="" goto G_inserttailend
  97. echo %2 >>%G_inserttailtxt%
  98. shift /2
  99. goto getG_inserttail
  100. :G_inserttailend
  101. set G_inserttailtxt=
  102. goto :eof
复制代码

TOP

原帖由 defanive 于 2009-2-1 20:46 发表
这个难度太高了。。。

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

结果后来解 ...

system尽量不要用,有系统API摆着呢
话说我可以用P处理做个红黑树链表用于快速查找数据...哈哈...

TOP

做了个普通的Array..还没改成专用的形式嘿嘿,好心人帮助下咯
也没提供特殊字符&输入错误处理
提供以下函数:
CreateArray 创建一个数组,注意:从_1开始
GetLength  获取数组长度
SetAt   设置特定位置元素
GetAt   获取特定位置元素
MapArray   对整个(或指定多个位置)数组执行相同操作
EchoArray   以指定方式输出整个元素
InsertAt     在指定位置后插入一个元素
InsertArray  在指定位置后插入一个以CreateArray创建的数组
RemoveArray   删除指定位置后指定个元素
RemoveAll   清空数组
IsEmpty    若数组(不)为空,执行指定操作
PushArray   在数组末尾增加一个元素
PopArray    弹出数组末尾的一个元素
ReadArray   从文件(或控制台输入)读取数组元素
FindArray   在数组里查找其中一个指定元素
  1. CreateArray <name> <size> <defaultvalue>
  2. example:
  3.      call :CreateArray array 10 %%%%i
  4. GetLength  <name> <result>
  5. example:
  6.      call :GetLength array length
  7. SetAt   <name> <index> <value>
  8. example:
  9.      call :SetAt array 6 我是第六个元素
  10. GetAt   <name> <index> <result>
  11. example:
  12.      call :GetAt array 6 value
  13. MapArray   <name> <index> <flag>
  14. example:
  15.      call :MapArray array "1 2 4 6" "set/a$item$+=$index[code]CreateArray <name> <size> <defaultvalue>
  16. example:
  17.      call :CreateArray array 10 %%%%i
  18. GetLength  <name> <result>
  19. example:
  20.      call :GetLength array length
  21. SetAt   <name> <index> <value>
  22. example:
  23.      call :SetAt array 6 我是第六个元素
  24. GetAt   <name> <index> <result>
  25. example:
  26.      call :GetAt array 6 value
  27. MapArray   <name> <index> <flag>
  28. example:
  29.      call :MapArray array "1 2 4 6" "set/a$item$+=$index$&quot;
  30.      rem   以上代码将array中第1个数据加1,第2个数据加2,第4个数据加4,第6个数据加6
  31.      call :MapArray array All "fsutil file createnew $value$.txt"
  32. EchoArray   <name> <flag>
  33. example:
  34.      call :EchoArray array "第$index$个元素是$value$&quot;
  35. InsertAt   <name> <index> <value>
  36. example:
  37.      call :InsertAt array 0 我是第一个元素咯
  38. InsertArray  <name> <index> <array>
  39. example:
  40.      call :CreateArray array 10 %%%%i
  41.      call :CreateArray array2 4 新%%%%i
  42.      call :InsertArray array 3 array2
  43. RemoveArray   <name> <index> <count>
  44. example:
  45.      call :RemoveArray array 3 2
  46.      rem 以上代码删去第4,5个元素
  47. RemoveAll  <name>
  48. example:
  49.      call :RemoveAll array
  50. IsEmpty    <name> <flag> {not}
  51. example:
  52.      call :IsEmpty array 空了空了
  53.   call :IsEmpty array 里面还有东西呢 not
  54. PushArray   <name> <value>
  55. example:
  56.      call :PushArray array 我是新人
  57. PopArray    <name> <result>
  58. example:
  59.      call :PopArray array Result
  60. ReadArray   <name> <file>|<"" <tip> <endflag>>
  61. example:
  62.      call :ReadArray array input.txt
  63.      call :ReadArray array "" Input: " "
  64.      rem endflag即结束标志...以上代码表示输入的是空格时结束
  65. FindArray   <name> <result> <findindex> <findstring>
  66. example:
  67.      call :FindArray array result 2 找我啊
  68.   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$&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 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]
  1. 示例:
  2. 创建50个文件夹
  3. call :CreateArray array 50 %%%%i
  4. call :MapArray array "md $value[code]示例:
  5. 创建50个文件夹
  6. call :CreateArray array 50 %%%%i
  7. call :MapArray array "md $value$&quot;
  8. 查找hello.txt文件中第二个hello
  9. call :CreateArray array 1 ""
  10. call :ReadArray array hello.txt
  11. call :FindArray array re 2 hello
  12. echo %re%
复制代码
quot;
查找hello.txt文件中第二个hello
call :CreateArray array 1 ""
call :ReadArray array hello.txt
call :FindArray array re 2 hello
echo %re%[/code]
  1. @echo off&setlocal enabledelayedexpansion
  2. exit
  3. :CreateArray
  4. set %~1_class=Array
  5. set %~1_length=%~2
  6. for /l %%i in (1,1,%~2) do set "%~1_%%i=%~3"
  7. goto :eof
  8. :GetLength
  9. set %~2=!%~1_length!
  10. goto :eof
  11. :SetAt
  12. if %~2 gtr 0 if %~2 leq !%~1_length! set "%~1_%~2=%~3"
  13. goto :eof
  14. :GetAt
  15. set  %~3=$NULL$&if %~2 gtr 0 if %~2 leq !%~1_length! set "%~3=!%~1_%~2!"
  16. goto :eof
  17. :EchoArray
  18. set out=%~2
  19. for /l %%i in (1,1,!%~1_length!) do set "t=!out:$index$=%%i!"&call,set "t=%%t:$value$=!%~1_%%i!%%"&echo !t!
  20. goto :eof
  21. :MapArray
  22. set "out=%~3"
  23. set fex=for %%i in (%~2)
  24. if "%~2"=="All" set "fex=for /l %%i in (1,1,!%~1_length!)"
  25. %fex% do set "t=!out:$item$=%~1_%%i!"&set "t=!t:$index$=%%i!"&call,set "t=%%t:$value$=!%~1_%%i!%%"&!t!
  26. goto :eof
  27. :InsertAt
  28. set/ab=%~2+1
  29. for /l %%i in (!%~1_length!,-1,%b%) do set/as=%%i+1&set "%~1_!s!=!%~1_%%i!"
  30. set/a%~1_length+=1
  31. set "%~1_%b%=%~3"
  32. goto :eof
  33. :InsertArray
  34. for /l %%i in (!%~1_length!,-1,%~2) do set/as=%%i+!%~3_length!&set "%~1_!s!=!%~1_%%i!"
  35. for /l %%i in (1,1,!%~3_length!) do set/as=%%i+%~2&set "%~1_!s!=!%~3_%%i!"
  36. set/a%~1_length+=%~3_length
  37. goto :eof
  38. :RemoveArray
  39. set/ab=%~2+1
  40. set/ae=%~1_length-%~3
  41. for /l %%i in (%b%,1,%e%) do set/as=%%i+%~3&call,set "%~1_%%i=%%%~1_!s!%%"
  42. set/a%~1_length-=%~3
  43. goto :eof
  44. :RemoveAll
  45. set %~1_length=0
  46. goto :eof
  47. :IsEmpty
  48. if %~3 "!%~1_length!"=="0" %2
  49. goto :eof
  50. :PushArray
  51. set/a%~1_length+=1
  52. set "%~1_!%~1_length!=%~2"
  53. goto :eof
  54. :PopArray
  55. set "%~2=%~1_!%~1_length!"
  56. set/a%~1_length-1
  57. goto :eof
  58. :ReadArray
  59. set %~1_length=0
  60. if "%~2" neq "" (for /f "delims=" %%i in (%2) do set/a%~1_length+=1&set "%~1_!%~1_length!=%%i")&goto :eof
  61. set/pt=%~3
  62. :k
  63. if "!t!"=="%~4" goto :eof
  64. set/a%~1_length+=1
  65. set %~1_!%~1_length!=!t!
  66. set/pt=%~3
  67. goto k
  68. :FindArray
  69. set %~2=$NULL$&set b=0
  70. for /l %%i in (1,1,!%~1_length!) do if "!%~1_%%i!"=="%~4" set/ab+=1&if !b!==%~3 set %~2=%%i&goto :eof
  71. goto :eof
复制代码
搞定...回家睡睡~

TOP

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

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

TOP

返回列表