本帖最后由 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 一次性生成临时文件- @echo off &more +3 "%~f0">tmp.vbs
- for /f "delims=" %%v in ('cscript /nologo /e:vbscript tmp.vbs') do echo,%%v
- del/q "tmp.vbs"&pause&exit/b
- msgbox "run vbs code in bat"
- wsh.echo "Printed by VBS"
复制代码 b。先用 findstr 自动获取 '代码分割行号' 再交付 more +n 一次性生成临时文件- @echo off &for /f "delims=:" %%n in ('findstr /bn ''' "%~f0" ') do more +%%n "%~f0">tmp.vbs
- cscript /nologo /e:vbscript tmp.vbs &del/q "tmp.vbs"&pause&exit/b
- '''
- msgbox "run vbs code in bat"
- wsh.echo "Printed by VBS"
复制代码 c。用 echo 或 set/p 逐行写出临时文件(多用于生成一行流代码)- @echo off &echo,msgbox "run vbs code in bat":wsh.echo "Printed by VBS">tmp.vbs
- cscript /nologo /e:vbscript tmp.vbs &del/q "tmp.vbs"&pause&exit/b
复制代码 二。不采用临时文件的方法
这类方法的主要优点就是不用临时文件也可载入多行 vbs 代码
a。用 mshta 脚本引擎
此法主要缺点是启运 mshta 脚本会因开关窗口而导致屏闪(但如需调用 hta/vbs 实时交互操作则可消解此缺点),某些 vbs 内置功能会被 ie 引擎禁用(如 wsh.echo 等)- :<!--
- @echo off &mshta "%~f0" &pause&exit/b
- -->
- <script language="VBScript">
- msgbox "run vbs code in bat"
- close
- </script>
复制代码 b。用 cscript 的 wsf 脚本结构
此法主要缺点是启运 wsf 脚本会因开关窗口而导致屏闪(但如需调用 vbs 实时交互操作则可消解此缺点)- :<!--
- @echo off &for /f "delims=" %%v in ('cscript /nologo "%~f0?.wsf" ') do echo,%%v
- pause&exit/b
- -->
- <job id="vbs"><script language="VBScript">
- msgbox "run vbs code in bat"
- wsh.echo "Printed by VBS"
- </script></job>
复制代码 c。用 ctrl+z (0x1a) 不可见控制符修复 bat+vbs 混编代码的 '结点'(如下示例代码首行中的 '@ 之间即为不可见控制符)
此法主要优点是消解了用某些混编方法如 ' 2>nul&cls 前缀造成的屏闪 '硬伤',但此法不宜用于多行 bat 代码- ::'@echo off &cscript //nologo //e:vbscript "%~f0" &pause&exit/b
- msgbox "run vbs code in bat"
- wsh.echo "Printed by VBS"
复制代码
|