Board logo

标题: [其他] [分享]vbs配合bat实现小数运算的计算器 [打印本页]

作者: defanive    时间: 2010-6-21 15:40     标题: [分享]vbs配合bat实现小数运算的计算器

我一直很看好vbs,希望能跟bat完美结合。。。
cscript启动vbs需要一定时间,为了弥补这个缺陷,今天试试新的方法。。。

下面是一个支持小数运算的计算器

123.bat
  1. @echo off
  2. call :startvbs
  3. :loop
  4. set /p a=输入一个算式(支持小数哦):
  5. echo return %a%>1.txt
  6. call :getret ans
  7. echo %ans%
  8. goto loop
  9. :getret
  10. if not exist 1.txt call :err
  11. if not exist 2.txt goto getret
  12. set /p %1=<2.txt
  13. del /f 2.txt
  14. goto :eof
  15. :startvbs
  16. echo.>1.txt
  17. start /b cmd /c cscript dy.vbs //nologo 2^>nul^&del /f 1.txt
  18. ping -n 1 127.0.0.1 >nul
  19. goto :eof
  20. :err
  21. echo vbs发生错误>2.txt
  22. call :startvbs
  23. goto :eof
  24. :exitvbs
  25. echo wscript.quit>1.txt
复制代码


dy.vbs
  1. sf="1.txt"
  2. rf="2.txt"
  3. wait=20
  4. clearscript
  5. do
  6. wscript.sleep wait
  7. a=readscript
  8. if a<>vbcrlf then
  9. clearscript
  10. execute a
  11. end if
  12. loop
  13. function readscript()
  14. set f=createobject("scripting.filesystemobject").opentextfile(sf)
  15. readscript=f.readall
  16. f.close
  17. end function
  18. sub clearscript()
  19. set f=createobject("scripting.filesystemobject").opentextfile(sf,2,true)
  20. f.writeline
  21. f.close
  22. end sub
  23. sub return(s)
  24. set f=createobject("scripting.filesystemobject").opentextfile(rf,2,true)
  25. f.writeline s
  26. f.close
  27. end sub
复制代码


运行123.bat即可,输入小数算式(例如12.3+45.6),即可看到结果。。。

别看代码很长,实际上dy.vbs是不需要改的,123.bat也只需要改主体和err标签即可
startvbs用于启动vbs(一般在批处理开始时调用一次)
需要运行的代码用echo ...>1.txt即可运行
getret用于取得运行的结果
err用于vbs的出错处理
exitvbs用于退出vbs

例如主体部分可以改成下列代码(其余标签不变):
  1. @echo off
  2. call :startvbs
  3. :loop
  4. set /p a=输入一个算式(支持小数哦):
  5. echo return %a%>1.txt
  6. call :getret ans
  7. echo return msgbox("答案是%ans%")>1.txt
  8. call :getret
  9. goto loop
复制代码


就可以实现将答案显示在弹出对话框中。。。

还可以实现选择文件夹,总之vbs可以做到,bat就能做到:
  1. @echo off
  2. call :startvbs
  3. echo 请选择一个文件夹
  4. echo return createobject("Shell.Application").browseforfolder(0,"选择目录:",0,0).self.path>1.txt
  5. call :getret fn
  6. echo %fn%
  7. pause
  8. call :exitvbs
  9. goto :eof
复制代码

作者: defanive    时间: 2010-6-21 15:46

另外说明一下,getret要得到结果,echo ...>1.txt中要使用return语句
另外,echo ...>1.txt可以一次执行多行,如下:
  1. @echo off
  2. call :startvbs
  3. set /p a=请输入第一个数:
  4. set /p b=请输入第二个数:
  5. (echo a=%a%
  6. echo b=%b%
  7. echo return a+b
  8. )>1.txt
  9. call :getret ret
  10. echo 和为:%ret%
  11. pause
  12. call :exitvbs
  13. goto :eof
复制代码

作者: defanive    时间: 2010-6-22 00:36

好吧,为什么没人理我。。。
杯具,顶起。。。
作者: sgaizxt001    时间: 2010-6-22 08:46

不懂VBS,路过帮你顶一下
书上说的是C语言支持的运算符号是最多的,你把C++的math.h库函数弄弄,做成第3方,然后用bat调用如何
我这几天看那个看的头晕,格式太多啦,完全转不过来

[ 本帖最后由 sgaizxt001 于 2010-6-22 08:50 编辑 ]
作者: 523066680    时间: 2010-6-22 10:14     标题: 回复 3楼 的帖子

好吧,因为习惯了用cscript 模式 实现cmd那种交互,又能有vbs的功能。并且又同是vbs的变量
可以根据要求做更多的配合计算。

[ 本帖最后由 523066680 于 2010-6-22 10:19 编辑 ]
作者: Spring    时间: 2010-6-22 11:03

"cscript启动vbs需要一定时间,为了弥补这个缺陷"......

那你一直频繁的读写文件不也是一个大大的缺陷么。。。。
作者: zqz0012005    时间: 2010-6-22 21:23

"cscript启动vbs需要一定时间,为了弥补这个缺陷"......
不知道楼主要表达什么,你自己不还是用了cscript+临时文件?舍近求远?

一般来说,只要学会了vbs的人,应该都知道vbs与bat结合的方法吧?早已不算新方法了。

也许是想做一个通用的架构,但显然不太合适的。

曾经搞了一个vbs版的CMD,利用 WScript的StdIn/StdOut/StdErr 标准流 及exec方法返回的WshScriptExec对象,对ReadLine进行解析再调用相应函数或命令,发现还是不够方便,而且有些情况无法处理,后来扔下不搞了。有时间再找出来一起玩玩。
作者: defanive    时间: 2010-6-22 21:56

我的意思是,传统的方法是需要执行一次vbs代码就调用一次cscript,而cscript启动vbs需要一段时间,所以效率总是提不上去。。。
而顶楼的方法是,启动一次cscript,让vbs一直存活并等待批处理的命令,得到命令就立即返回,效率高很多。。。
作者: 523066680    时间: 2010-6-22 22:46     标题: 回复 8楼 的帖子

类似读脚本或者解读指令的方式嘛。  应该是因为挺多学习过vbs的人实践过.....

临时用的供调用的
set inp=wscript.stdin
set put=wscript.stdout

put.writeline "the result save to x"
while true
put.write "Test:"
yousay=inp.readline
if yousay="exit" then
   wscript.quit
end if
x=eval(yousay)
put.writeline "x=" & x
wend

========================
x记录上一次计算的值 ,可以再下次式子中加入x  。
额,只附加了x,没有其他机制, 另外有个eval.bat 调用它并进入vbs循环 ,这样我就不用输入 cscript //nologo 了.....

[ 本帖最后由 523066680 于 2010-6-22 22:50 编辑 ]
作者: zqz0012005    时间: 2010-6-22 23:13     标题: 回复 7楼 的帖子

找到了!

vbs版cmd
http://www.bathome.net/thread-8313-1-1.html
作者: BowAngel    时间: 2010-6-23 10:22

如果我现在需要把vbs的返回值存入批处理的一个变量中,如果不利用临时文件,不知道能不能实现?
作者: defanive    时间: 2010-6-24 00:24     标题: 回复 11楼 的帖子

应该不可能。。。

vbs与bat结合肯定有更好的方法。。。
总不能在实验阶段停下,实际上vbs与bat结合实际应用很少。。。
作者: Batcher    时间: 2010-6-24 11:47     标题: 回复 12楼 的帖子

vbs与bat结合在实际工作中应用很多
作者: batman    时间: 2010-6-26 10:18

支持batcher,事实上本人在工作经常用vbs+bat来处理问题。。。
作者: defanive    时间: 2010-6-26 18:17

但是效率?
难道调用一次vbs就cscript一次?效率可想而知。。。
作者: zqz0012005    时间: 2010-6-26 18:54     标题: 回复 15楼 的帖子

一般不是只调用一两次vbs就够了吗?否则的话,可能是你的程序设计的不够好。
事实上如果在bat中要用到vbs的话,我一般直接用vbs实现全部功能,不再通过bat来调用,除非用bat确实能带来便利。




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2