给出代码一则:- @echo off
- set /p a=Type:
- set "a=%a:"=""%"
- setlocal enabledelayedexpansion
- echo wscript.echo len("!a!")>a.vbs
- for /f %%a in ('cscript /nologo a.vbs') do set alength=%%a
- del /f /q a.vbs
- echo 长度为%alength%
- pause
复制代码 好了,这个例子给出的结果还比较理想:没有臃肿的代码,核心部分不到5行,强大乎~
当然,这个不是我最先提出来的。。。
这里是运用了VBS中的WScript.Echo方法,就是向脚本宿主发送消息。。。
当直接双击运行VBS的时候,脚本宿主是WScript,但是在CMD中用CScript来调用的话脚本宿主就是CMD了,实现了结果的输出。。。
那么接下来就只需要通过For,读取结果并赋值就可以了。。。- 创建VBS —> VBS计算结果 —> VBS返回结果 —> 通过For获取结果 —> 删除VBS
复制代码 当然,可行性不高。每次都这样做的话,也算是很麻烦的,代码也变长很多,临时文件多。。。
改造方案一:Mshta调用
这样做的最大好处是,没有临时文件,无论怎么做都可以,只要在一行只内,是很理想的方案。。。- mshta vbscript:WScript.Echo(Len("123"))(window.close)
复制代码 很可惜的是,执行失败,提示缺少WScript对象。。。
分析下原因:
缺少WScript对象,就是没有脚本宿主,怎么听都像扯谈,既然都能执行了,怎么会没有脚本宿主呢?
其实我们看看命令本身,我们就会知道答案:mshta?!
没看出来?正常,因为这个命令是缩写,但是这样写你就能看出来:MS-HTA!!
对,实际上,我们所编写的VBS代码都是在一个HTA上面运行的,HTA实际上就是一个网页。。。
是网页调用脚本,并不是脚本被脚本宿主解析并执行!
所以,mshta调用是没有脚本宿主的。。。
方案一无效。。。
改造方案二:外部命令化
我们常用的内部命令,外部命令,不外乎都是EXE和COM,能实现一定的功能,多为高级语言所编写。。。
借助命令的思想,可以把编写好的VBS作为一个外部的命令。。。
例子一个:
Example.vbs- @Echo Off
- SetLocal EnableDelayedExpansion
- Set /p a=Type:
- Call :Functions "aLength" "StrLen" "!a!"
- Call :Functions "pButton" "MsgBox" "字串符!a!的长度为!aLength!" "64" "CMD"
- Call :Functions "pButton" "MsgBox" "继续测试?" "68" "CMD"
- If %pButton%==6 (%0) else (Goto :EOF)
- :Functions
- Setlocal EnableExtensions
- For /f "tokens=1*" %%a in (""%*"") Do (For /f %%d in ('CScript /NoLogo Functions.vbs %%b') Do (set ret=%%d))
- Endlocal&Set "%~1=%ret%"
- Goto :EOF
复制代码 Functions.vbs- Set objArgs = WScript.Arguments
- If objArgs.Count<=0 Then WScript.quit
- Select Case objArgs(0)
- Case "StrLen"
- If objArgs.Count<2 Then WScript.quit
- WScript.Echo Len(objArgs(1))
- Case "MsgBox"
- If objArgs.Count<4 Then WScript.quit
- WScript.Echo MsgBox(objArgs(1),objArgs(2),objArgs(3))
- End Select
复制代码 测试效果很好。。。
可能有人会说,获取长度的话,完全可以自己写一个,消息框的话完全可以用mshta代替。。。
但是,这样虽然多了一个VBS文件,但是可拓充性很强。。。
如果你想获得一个字符的ASCII码值呢?如果你想实现浮点运算呢?如果你想小数开方、自然对数等等呢?
这样做,你完全可以马上写出来一个自己需要的伪劣“第三方命令行工具”!
至于消息框,用mshta你是不可能知道用户按下了哪个按钮,而这样做完全可以。。。
说说方案二的缺点:
测试环境:Window Vista Home Basic
在测试环境下,执行前需要花费0.3秒左右,能感受到明显的停顿,这是VBS的问题,启动慢
其次,并不能保证每台机器都有装上VBS,还是有部分用户没有装VBS的
第三,在VBS执行期间会增加两个进程(cmd.exe和cscript.exe),可以用任务管理器杀掉,导致返回值为空,或出错退出
第四,VBS损坏等直接导致执行失败,同命令行工具一样,少一个批处理都无法完成任务
好了,这个所谓的命令行工具,前途还是有的。。。
[ 本帖最后由 defanive 于 2009-2-22 17:14 编辑 ] |