注:本文受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 SelectCOPY |
其中大致结构如下(文件结构从上到下):
头部内容,Echo Off以及关闭错误流输出。原始方案是不关闭错误流,但是批处理较长时不方便'>nul 2>nul&echo off&cls 2>nul 3>nulCOPY 批处理代码,每行前要加'&,混编需要'&echo 批处理代码COPY 调用代码,调用:'Call标签并实现相应功能'&Call :'Call "返回变量" "函数" "参数一"……COPY :'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 :eofCOPY |
vbs代码,用于拓充功能,建议采用以下格式 | Set Arg=WScript.Arguments | | Select Case LCase(Arg(0)) | | Case "函数一"…… | | WScript.Echo 返回值Case "函数二"…… | | WScript.Echo 返回值…… | | End SelectCOPY |
利用vbs能有效地提升批处理的功能,但目前还有许多缺陷
最主要是混编结构并不方便,对于大工作量批处理比较累赘 |