在多个 WSF 进程之间共享 Excel.Application 个可执行文件?

Share Excel.Application executable among multiple WSF processes?

我有一个通过 WSF 启动 50 个左右 VBS 脚本的系统,这些脚本需要留在那里直到系统的另一部分连接到它们,然后它们充当服务器一段时间直到对等端断开连接,然后它们退出并重新启动。

出于初始化目的,它们都使用EXCEL.EXE从电子表格中读取大量参数,通过

Set objExcel = CreateObject("Excel.Application")

我们不能同时拥有 50 EXCEL.EXEs 运行,因此重启是按顺序进行的,因此永远不会超过一个 EXCEL.EXE 运行:通常为零,因为它们只使用 15-20 秒然后释放。

但是有时会出错,WSF 脚本会退出,而它启动的 EXCEL.EXE 会保留在那里。所以我们确实看到了多达十几个 EXCEL.EXE 个进程。

我的问题是关于使用 GetObject() 而不是 CreateObject()。是否可以使用 GetObject(),以便如果已经有一个 EXCEL.EXE 运行,它会使用那个而不是开始一个新的?如果可以,还需要哪些其他步骤?

这里还有一个补充问题,关于为什么 EXCEL.EXE 在启动它们的 VBS 退出后仍然存在,但我可以想象 VBS 退出(或被杀死)的方式允许那。

请注意,问题也部分与 EXCEL.EXE 的重新进入有关,我没有相关信息。

我不是这些脚本的作者,就外部对象而言,我的 VBS 不是很强,所以我在这里问一个微不足道的问题是完全可能的。

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

然而,看到僵尸 Excel.exe 进程存活是一个广泛的问题,这强烈表明脚本运行时没有正常退出。也许您现有脚本中的错误处理不太理想,当您用多个脚本抨击单个实例时,这不太可能变得更好。 Excel 跟不上时确实会变得很暴躁。使用 OpenXML api 或 Excel 服务是更好的方法。