有个帖子简单介绍了利用mshta来调用vbs的方法(链接)。
虽该文章作者认为
到此,在bat中使用vbs得到了完全解决。从此可以在bat和vbs间自由的航行了。
但任然无法获取vbs的返回值,可见该方法有一定缺陷。
于是写出该帖子来补充一下下~
先不看这个缺陷,原调用代码的html标签也可以不要(lz最早是看见zhonghua兄使用该方法)
Mshta Vbscript:VBS命令(Close)
感谢zhonghua,我们来看几个例子:
Mshta Vbscript:Msgbox("Hello,world!")(Close)
Mshta Vbscript:CreateObject("SApi.SpVoice").Speak("Hello,world!"&vbNewLine&"你好,世界!")(Close)
Mshta Vbscript:Msgbox("该电脑的设备和驱动器共有"&CStr(CreateObject("Scripting.FileSystemObject").Drives.Count)&"个。")(Close)
注意几点:
1、在例1中,Msgbox语句与后面的(Close)之间无需加任何符号,添加:还会报错。
2、在例2中,虽然SApi.SpVoice函数的.Speak方法严格来说是一个过程,但是因为Mshta接收的参数有限以及其他各种原因,必须用括号包裹而不是空格分隔。
再看一段代码:
@echo off
Setlocal enabledelayedexpansion
::CODER BY 老刘 POWERD BY iBAT
Mshta Vbscript:Msgbox("Hello,world!",1)(Close)
Echo %Errorlevel%
pause
测试者会发现无论点击哪个按钮,返回值都是0。
可能这个例子举得有些牵强,即使有返回值也不一定要从%Errorlevel%来返回是吧~
但是这是批处理获取其他Console程序的结果的方法之一。
既然这种方法不行,那我们为什么不试试另一种方法呢?
我们经常能看到批处理使用For/f+(‘Commands‘)的方法获取程序输出。
那么能否使用这种方法获取VBS代码运行后的返回值呢?
答案是肯定的,首先感谢PCL_Test斑竹。
来看我封装好的代码块:
Set Vbscript=VBS命令
for /f "Delims=" %%a in (
‘MsHta VBScript:Execute("CreateObject(""Scripting.Filesystemobject"").GetStandardStream(1).Write(%Vbscript:"=""%)"^)(close^)‘
) do Set "MsHtaReturnValue=%%a"
Set MsHtaReturnValue
该方法lz最初看到pcl斑竹使用,就拿来封装了下。
使用这种方法就可以获取Vbs代码运行的返回值了~
来修改刚才的例子:
@echo off
Setlocal enabledelayedexpansion
::CODER BY 老刘 POWERD BY iBAT
Set Vbscript=Msgbox("Hello,world!",1)
for /f "Delims=" %%a in (
‘MsHta VBScript:Execute("CreateObject(""Scripting.Filesystemobject"").GetStandardStream(1).Write(%Vbscript:"=""%)"^)(Close^)‘
) do Set "MsHtaReturnValue=%%a"
Set ReturnValue1=确定
Set ReturnValue2=取消或关闭窗口
Echo 你点击了!ReturnValue%MsHtaReturnValue%!。
pause
这样就可以正常运行了,鸡冻吧~
但是这样还有一个缺陷,Mshta运行时当前窗口会失去焦点(即当前窗口变灰),
当Mshta运行完毕后,窗口焦点又会恢复。
所以调用次数少或者脚本运行环境的电脑无鼠标操作的时候,可以放心使用该方法获得返回值。
但是如果要大量调用,还需要顺便干干其他什么事情的话,还是单独写一个Vbs调用较好。
原文地址:http://blog.51cto.com/oldliu/2066785