找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 6435|回复: 3

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

[复制链接]
发表于 2025-4-5 21:29:48 | 显示全部楼层 |阅读模式
本帖最后由 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技术 +1 收起 理由
Batcher + 1 感谢分享

查看全部评分

发表于 2025-4-7 08:28:50 | 显示全部楼层
谢谢分享
学习了
发表于 2025-4-7 18:36:58 | 显示全部楼层
本人不喜欢在批处理中调用 VBScript 脚本!如果批处理不能处理就直接改用 VBScript。VBScript 比批处理强多了。
 楼主| 发表于 2025-4-7 20:22:14 | 显示全部楼层
回复 3# chishingchan

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

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:24 , Processed in 0.013139 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表