标题: [其他] VBS拓充批处理 [打印本页]
作者: defanive 时间: 2009-9-26 21:40 标题: VBS拓充批处理
注:本文受523066680的启发所写
以前曾经发布过一个帖子,里面谈到了利用Cscript运行vbs,在vbs中利用Wscript.Echo返回信息,批处理用for读取,来实现vbs与批处理交互
这个是一个类似的例子,这里使用了bat与vbs混编的技巧,使得只需要一个文件就可以实现vbs与bat交互- '>nul 2>nul&echo off&cls 2>nul 3>nul
- :'loop
- '&set /p a=请输入算式:
- '&Call :'Call "ans" "Calc" "%a%"
- '&echo %ans%
- '&Call :'Call "null" "Speak" "%ans%" "6" "100"
- '&pause
- '&goto 'loop
- :'Call
- '&setlocal enableextensions
- '&for %%t in (%*) do if defined bool (call set arg=%%arg%% %%%%t) else (set bool=0&set v=%%~t)
- '&for /f "delims=" %%t in ('cscript /e:vbs /nologo "%~f0"%arg%') do set ret=%%t
- '&endlocal&set %v%=%ret%
- '&goto :eof
- Set Arg=WScript.Arguments
- Set Ws=CreateObject("WScript.Shell")
- Select Case LCase(Arg(0))
- Case "calc"
- WScript.Echo Eval(Arg(1))
- Case "speak"
- Set Sapi=CreateObject("sapi.spvoice")
- Sapi.Rate=Arg(2)
- Sapi.Volume=Arg(3)
- Sapi.Speak Arg(1)
- End Select
复制代码
其中大致结构如下(文件结构从上到下):
头部内容,Echo Off以及关闭错误流输出。原始方案是不关闭错误流,但是批处理较长时不方便- '>nul 2>nul&echo off&cls 2>nul 3>nul
复制代码
批处理代码,每行前要加'&,混编需要复制代码
调用代码,调用:'Call标签并实现相应功能- '&Call :'Call "返回变量" "函数" "参数一"……
复制代码
:'Call标签主体,其结构并不完美,对特殊字符等仍需改进- :'Call
- '&setlocal enableextensions
- '&for %%t in (%*) do if defined bool (call set arg=%%arg%% %%%%t) else (set bool=0&set v=%%~t)
- '&for /f "delims=" %%t in ('cscript /e:vbs /nologo "%~f0"%arg%') do set ret=%%t
- '&endlocal&set %v%=%ret%
- '&goto :eof
复制代码
vbs代码,用于拓充功能,建议采用以下格式- Set Arg=WScript.Arguments
- Select Case LCase(Arg(0))
- Case "函数一"……
- WScript.Echo 返回值Case "函数二"……
- WScript.Echo 返回值……
- End Select
复制代码
利用vbs能有效地提升批处理的功能,但目前还有许多缺陷
最主要是混编结构并不方便,对于大工作量批处理比较累赘
作者: rat 时间: 2009-9-26 23:48
echo=1'>nul & ...
作者: defanive 时间: 2009-9-26 23:55
2L的方法还是避免不了每行都得加上的悲剧
作者: rat 时间: 2009-9-26 23:58
原帖由 defanive 于 2009-9-26 23:55 发表
2L的方法还是避免不了每行都得加上的悲剧
用js的/**/批量注释
作者: defanive 时间: 2009-9-27 00:13
js也行,批量效率肯定要高,而且修改也不大。。。
但是貌似js没有vbs那么常用。。。
作者: 523066680 时间: 2009-9-27 08:03
我喜欢的是批处理的界面和既是优点又是缺点的部分,不是它的一切。
so~ 如果有类似的东西掺和,我不介意。
甚至正在尝试更多的使用cscript了,下面是个模仿电影渐显名单的show
http://www.cn-dos.net/forum/viewthread.php?tid=48969- if wscript.arguments.count = 0 then
- createobject("wscript.shell").run _
- "cmd /c title Hi~ cn-dos &mode con cols=50 lines=6 & "&_
- " cscript //nologo " &chr(34) &wscript.scriptname &chr(34) &" isme"
- wscript.quit
- end if
- :rem Made by if(e_x)ist@cn-dos
- set inp=wscript.stdin
- set put=wscript.stdout
- dim str(6)
- str(0)=" W W W . C N - D O S . N E T "
- str(1)=" B A T H O M E "
- str(2)=" L x m x n "
- str(3)=" E v e r e s t 7 9 "
- str(4)=" N e t B e n T o n "
- str(5)=" I F _ E X I S T "
- str(6)=" H u a h u a 0919 "
- for each strx in str
- call EchoInRnd(replace(space(len(strx))," ","-"),strx)
- call EchoInRnd(strx,strx)
- call EchoInRnd(strx,space(len(strx)))
- put.writeline
- next
- sub EchoInRnd(stra,strb)
- dim x(100)
- xlb=len(stra)
- xla=xlb-1
- for i = 0 to xlb
- x(i) = i
- next
- ln=stra
- for i = xla to 0 step -1
- tn=int(rnd*i)
- ln=left(ln,x(tn)) & mid(strb,x(tn)+1,1) & right(ln,xla-x(tn))
- wscript.sleep 50
- put.write chr(13)
- put.write space((50-xlb)/2) & ln
- x(tn)=x(i)
- next
- end sub
复制代码
关于混合
有时候确实是很需要对方的功能~ 不过当麻烦多了,我就会觉得。。。。。。。
[ 本帖最后由 523066680 于 2009-9-27 12:28 编辑 ]
作者: zqz0012005 时间: 2009-9-27 12:27
很落后的话题。。。
作者: zqz0012005 时间: 2009-9-27 12:31 标题: 回复 5楼 的帖子
js其实比vbs更强大,也更常用。
但M$为了宣扬vbs而对它作了某些优化(几乎感觉不到),却不优化js(优化js在M$操作系统上的实现)。鄙视之。。。
作者: 523066680 时间: 2009-9-27 12:48
js有 c 的感觉~
应该尝试…… 反正都是系统带有的。如果先看到vbs的,可能观念被vbs先入为主了。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |