咨询VBScript隐藏运行多批处理的脚本正确性、冗余代码及运行性能问题
VBScript 隐藏批处理运行的问题解答
你当前写的这段用批处理生成VBS的代码,存在多处会导致脚本直接运行失败的硬伤,先把这些问题说清楚,再对应解答你的三个疑问。
先提几个会直接导致脚本跑不起来的硬伤
- 第一次执行
Set WshShell = Nothing释放Shell对象后,后续所有调用WshShell.Run的代码都会触发“对象未定义”错误,因为你已经把可用的实例销毁了 - 代码里写了
do循环的起始标记,但没有搭配VBS要求的loop循环结束标记,脚本在语法解析阶段就会直接报错退出 - 批处理里直接echo带
&的语句时,没有对&做转义(需要写^&),批处理会把&当成命令分隔符,根本不会把这部分内容写到生成的VBS文件里
对应你的三个疑问
- 是否需要多次编写
Set WshShell = Nothing语句?
完全没必要。这个语句的作用是手动释放COM对象的内存引用,只要整个脚本运行过程中还需要用WshShell的方法,就不能中途把它置空。正常只需要在所有脚本逻辑执行完之后,在最后写一次就行,中间反复创建、销毁同一个对象的写法纯属鸡肋,还容易搞出运行错误。 - 是否可以通过单个VBScript按照该方式隐藏运行多个批处理文件?
可以。WshShell.Run的第二个参数传0,本身就是用来完全隐藏目标进程窗口的,在同一个VBS实例里连续调用这个方法,就能按顺序启动多个要隐藏运行的批处理。这个逻辑本身没有问题,只要你把语法写对、不提前释放对象就行。 - 该实现方式是否会导致运行速度下降?
基本不会。反复创建、销毁WshShell对象带来的性能损耗极小,耗时连1毫秒都不到,完全感知不到。真正影响速度的点和VBS隐藏运行的逻辑没关系:一是你代码里硬写的WScript.Sleep 7500是刻意加的7.5秒强制等待;二是VBS启动程序默认是异步的,整体速度主要看你那几个批处理本身的执行效率,脚本层的开销完全可以忽略。
可正常运行的修正版生成代码
:: 生成隐藏运行的VBS脚本 echo Set WshShell = CreateObject("WScript.Shell") > run_hidden.vbs echo WshShell.Run Chr(34) ^& "C:\Desktop\BatMan.bat" ^& Chr(34), 0 >> run_hidden.vbs echo WScript.Sleep 7500 >> run_hidden.vbs echo WshShell.Run Chr(34) ^& "C:\Downloads\BatManSetup1.bat" ^& Chr(34), 0 >> run_hidden.vbs echo WshShell.Run Chr(34) ^& "C:\Downloads\BatManSetup4.bat" ^& Chr(34), 0 >> run_hidden.vbs echo WshShell.Run Chr(34) ^& "C:\Downloads\BatManSetup5.bat" ^& Chr(34), 0 >> run_hidden.vbs echo WshShell.Run Chr(34) ^& "C:\Downloads\BatManSetup6.bat" ^& Chr(34), 0 >> run_hidden.vbs echo WshShell.Run Chr(34) ^& "C:\Downloads\BatManMain.bat" ^& Chr(34), 0 >> run_hidden.vbs echo Set WshShell = Nothing >> run_hidden.vbs
内容的提问来源于stack exchange,提问作者soprosostupid
相关产品推荐
相关产品推荐

