有个帖子简单介绍了利用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 offSetlocal enabledelayedexpansion::CODER BY 老刘 POWERD BY iBATMshta 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 offSetlocal enabledelayedexpansion::CODER BY 老刘 POWERD BY iBATSet 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调用较好。

©著作权归作者所有:来自51CTO博客作者老刘001的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. centos7修改主机名方法
  2. pexpect-2.3安装方法
  3. ERROR 2002 (HY000): Cant connect to local MySQL server throu
  4. 测试 python的魔术方法大全!记得收藏!!!
  5. 让 AirPods 在 iPhone 和其它苹果设备之间自动切换的方法
  6. 设计模式4之模板方法模式
  7. 我用注解实现了优雅的跨库查询,架构师竖起了大拇指
  8. 如何基于元学习方法进行有效的模型训练?四篇论文详细剖析元模型的
  9. Linux系统下对文件和字符串 进行加密的方法总结

随机推荐

  1. java.util.ConcurrentModificationExcept
  2. 【Android】android开发过程遇到的问题以
  3. Android手机客户端与Servlet交换数据
  4. android中关于调用super的时机
  5. Android 开发之获取手机中所有App
  6. android > 旋转屏幕时 不重加载 activity
  7. Android编译系统详解(三)
  8. Android获取手机存储空间大小
  9. Android build.gradle 中 使用 buildConf
  10. Android 文件IO总结