[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[原创] 在批处理中调用VBScript(支持获取返回值)

翻了翻论坛,有个帖子简单介绍了利用mshta来调用vbs的方法(链接)。
虽该文章作者认为
到此,在bat中使用vbs得到了完全解决。从此可以在bat和vbs间自由的航行了。

但任然无法获取vbs的返回值,可见该方法有一定缺陷。
于是写出该帖子来补充一下下~
先不看这个缺陷,原调用代码的html标签也可以不要(lz最早是看见zhonghua兄使用该方法)
  1. Mshta Vbscript:VBS命令(Close)
复制代码
感谢zhonghua,我们来看几个例子:
  1. Mshta Vbscript:Msgbox("Hello,world!")(Close)
复制代码
  1. Mshta Vbscript:CreateObject("SApi.SpVoice").Speak("Hello,world!"&vbNewLine&"你好,世界!")(Close)
复制代码
  1. Mshta Vbscript:Msgbox("该电脑的设备和驱动器共有"&CStr(CreateObject("Scripting.FileSystemObject").Drives.Count)&"个。")(Close)
复制代码
注意几点:
1、在例1中,Msgbox语句与后面的(Close)之间无需加任何符号,添加:还会报错。
2、在例2中,虽然SApi.SpVoice函数的.Speak方法严格来说是一个过程,但是因为Mshta接收的参数有限以及其他各种原因,必须用括号包裹而不是空格分隔。

再看一段代码:
  1. @echo off
  2. Setlocal enabledelayedexpansion
  3. ::CODER BY 老刘 POWERD BY iBAT
  4. Mshta Vbscript:Msgbox("Hello,world!",1)(Close)
  5. Echo %Errorlevel%
  6. pause
复制代码
测试者会发现无论点击哪个按钮,返回值都是0。
可能这个例子举得有些牵强,即使有返回值也不一定要从%Errorlevel%来返回是吧~
但是这是批处理获取其他Console程序的结果的方法之一。
既然这种方法不行,那我们为什么不试试另一种方法呢?
我们经常能看到批处理使用For/f+('Commands')的方法获取程序输出。
那么能否使用这种方法获取VBS代码运行后的返回值呢?
答案是肯定的,首先感谢PCL_Test斑竹。
来看我封装好的代码块:
  1. Set Vbscript=VBS命令
  2. for /f "Delims=" %%a in (
  3. 'MsHta VBScript:Execute("CreateObject(""Scripting.Filesystemobject"").GetStandardStream(1).Write(%Vbscript:"=""%)"^)(close^)'
  4. ) do Set "MsHtaReturnValue=%%a"
  5. Set MsHtaReturnValue
复制代码
该方法lz最初看到pcl斑竹使用,就拿来封装了下。
使用这种方法就可以获取Vbs代码运行的返回值了~
来修改刚才的例子:
  1. @echo off
  2. Setlocal enabledelayedexpansion
  3. ::CODER BY 老刘 POWERD BY iBAT
  4. Set Vbscript=Msgbox("Hello,world!",1)
  5. for /f "Delims=" %%a in (
  6. 'MsHta VBScript:Execute("CreateObject(""Scripting.Filesystemobject"").GetStandardStream(1).Write(%Vbscript:"=""%)"^)(Close^)'
  7. ) do Set "MsHtaReturnValue=%%a"
  8. Set ReturnValue1=确定
  9. Set ReturnValue2=取消或关闭窗口
  10. Echo 你点击了!ReturnValue%MsHtaReturnValue%!。
  11. pause
复制代码
这样就可以正常运行了,鸡冻吧~
但是这样还有一个缺陷,Mshta运行时当前窗口会失去焦点(即当前窗口变灰),
当Mshta运行完毕后,窗口焦点又会恢复。
所以调用次数少或者脚本运行环境的电脑无鼠标操作的时候,可以放心使用该方法获得返回值。
但是如果要大量调用,还需要顺便干干其他什么事情的话,还是单独写一个Vbs调用较好。
1

评分人数

本帖最后由 yhcfsr 于 2018-1-30 15:07 编辑

天啊,我突然有种茅塞顿开的感觉,太鸡冻了
这表示,只要在CMD中有回显值都可以用这个方法获取,不管是CMD,VBS,还是POWERSHELL

TOP

返回列表