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

[代码合集] 批处理脚本调用 vbs 代码的几种方法对比

本帖最后由 aloha20200628 于 2025-4-7 10:29 编辑


    自 win11 24H2 更新后已确认了对 vbs 的 FOD(按需功能) 预装支持,如此 vbs 被新版 win11+ 至少会续命到 2027,其实 vbs 的应用活跃量最终还是取决于用户真实使用的 windows 版本,本坛新帖中仍不断有来自 xp/win7-10 的求助,而 vbs 以及同门兄弟 jscript 所特有的轻便优势和丰富遗产也确实为回帖解答开辟了一条 ‘高速道’,此谓本帖开门词吧 ...

    中外老帖中关于批处理脚本调用 vbs 代码的解决方案有多种版本,有些处理方法过于粗糙会留下 '硬伤',有些句式比较繁琐(如在 for/f 管道中塞入长串 mshta/vbs 代码须细心配置双引号等特殊字符),现从中择其人气较高者(共6个版本)作一个简要对比,仅供参考...

一。采用临时文件的方法
这类方法的主要优点是可载入多行代码,且运行 vbs 代码不会产生屏闪

a。直接将 '代码分割行号' 交付 more +n 一次性生成临时文件
  1. @echo off &more +3 "%~f0">tmp.vbs
  2. for /f "delims=" %%v in ('cscript /nologo /e:vbscript tmp.vbs') do echo,%%v
  3. del/q "tmp.vbs"&pause&exit/b
  4. msgbox "run vbs code in bat"
  5. wsh.echo "Printed by VBS"
复制代码
b。先用 findstr 自动获取 '代码分割行号' 再交付 more +n 一次性生成临时文件
  1. @echo off &for /f "delims=:" %%n in ('findstr /bn ''' "%~f0" ') do more +%%n "%~f0">tmp.vbs
  2. cscript /nologo /e:vbscript tmp.vbs &del/q "tmp.vbs"&pause&exit/b
  3. '''
  4. msgbox "run vbs code in bat"
  5. wsh.echo "Printed by VBS"
复制代码
c。用 echo 或 set/p 逐行写出临时文件(多用于生成一行流代码)
  1. @echo off &echo,msgbox "run vbs code in bat":wsh.echo "Printed by VBS">tmp.vbs
  2. cscript /nologo /e:vbscript tmp.vbs &del/q "tmp.vbs"&pause&exit/b
复制代码
二。不采用临时文件的方法
这类方法的主要优点就是不用临时文件也可载入多行 vbs 代码

a。用 mshta 脚本引擎
此法主要缺点是启运 mshta 脚本会因开关窗口而导致屏闪(但如需调用 hta/vbs 实时交互操作则可消解此缺点),某些 vbs 内置功能会被 ie 引擎禁用(如 wsh.echo 等)
  1. :<!--
  2. @echo off &mshta "%~f0" &pause&exit/b
  3. -->
  4. <script language="VBScript">
  5. msgbox "run vbs code in bat"
  6. close
  7. </script>
复制代码
b。用 cscript 的 wsf 脚本结构
此法主要缺点是启运 wsf 脚本会因开关窗口而导致屏闪(但如需调用 vbs 实时交互操作则可消解此缺点)
  1. :<!--
  2. @echo off &for /f "delims=" %%v in ('cscript /nologo "%~f0?.wsf" ') do echo,%%v
  3. pause&exit/b
  4. -->
  5. <job id="vbs"><script language="VBScript">
  6. msgbox "run vbs code in bat"
  7.     wsh.echo "Printed by VBS"
  8. </script></job>
复制代码
c。用 ctrl+z (0x1a) 不可见控制符修复 bat+vbs 混编代码的 '结点'(如下示例代码首行中的 '@ 之间即为不可见控制符)
此法主要优点是消解了用某些混编方法如 ' 2>nul&cls 前缀造成的屏闪 '硬伤',但此法不宜用于多行 bat 代码
  1. ::'@echo off &cscript //nologo //e:vbscript "%~f0" &pause&exit/b
  2. msgbox "run vbs code in bat"
  3. wsh.echo "Printed by VBS"
复制代码
1

评分人数

回复 3# chishingchan

好多年以前,就有人说过 vbs 比批处强多了,后来又有人说 powershell 比 vbs 强多了,再后来又有人说 c# 比 powershell 强多了... 一晃几十年过去了,至今还是 萝卜白菜各有所爱,尺有所短,寸有所长,不过如此...

TOP

本人不喜欢在批处理中调用 VBScript 脚本!如果批处理不能处理就直接改用 VBScript。VBScript 比批处理强多了。

TOP

谢谢分享
学习了

TOP

返回列表