我有一个系统通过WSF启动50个左右的VBS脚本,需要保持在那里直到系统的另一部分连接到它们,然后它们作为服务器一点点直到对等体断开连接,然后它们退出并获得重新启动。
出于初始化目的,它们都使用EXCEL.EXE从电子表格中读取大量参数,通过
Set objExcel = CreateObject("Excel.Application")
我们不能同时运行50个EXCEL.EXE,因此重新启动是顺序化的,因此永远不会有多个EXCEL.EXE运行:通常为零,因为它们仅用于15 -20秒然后释放。
但是,有时出现问题,WSF脚本退出,它启动的EXCEL.EXE保持不变。所以我们确实看到了十几个EXCEL.EXE进程。
我的问题是关于使用GetObject()
代替CreateObject()
。是否可以使用GetObject()
以便如果已经运行了EXCEL.EXE,它将使用那个而不是开始一个新的?如果是这样,还需要采取其他措施吗?
此处还有一个补充问题,关于为什么EXCEL.EXE在启动它们的VBS退出后仍然存在,但我可以想象VBS可以退出(或被杀死)的方式允许这样做。
请注意,问题还部分在于EXCEL.EXE的重新入侵,我没有相关信息。
我不是这些剧本的作者,而且就外部对象而言,我在VBS中并不是很强大,所以我完全有可能在这里提出一个微不足道的问题
答案 0 :(得分:4)
this old KB article中记录了GetObject()的用法。获取第一个实例需要进行错误处理。像这样:
Dim excel
On Error Resume Next
Set excel = GetObject(, "Excel.Application")
If Err.number = 429 Then
Set excel = CreateObject("Excel.Application")
End If
If Err.number <> 0 Then
WScript.Echo "Could not start Excel: " & err.Description
End
End If
'' etc
然而,看到zombie Excel.exe进程幸存是一个广泛关注的问题,它强烈建议脚本运行时不会正常退出。也许现有脚本中的错误处理不太理想,当您使用多个脚本抨击单个实例时,这种情况不太可能变得更好。当它无法跟上时,Excel确实变得非常暴躁。使用OpenXML api或Excel Services是更好的方法。