2015-10-30 48 views
1

我有一個系統通過WSF啓動50個左右的VBS腳本,需要等到系統的另一部分連接到它們,然後它們充當服務器,直到對方斷開連接,然後它們退出並重新啓動。在多個WSF進程中共享Excel.Application可執行文件?

對於初始化目的,它們都使用了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,所以我在這裏提出一個微不足道的問題是完全可能的。

+2

你有沒有看過[如何在VBScript中使用GetObject](http://stackoverflow.com/questions/1193952/how-to-use-getobject-in-vbscript),以獲得您應該運行的實例能夠做一些事情,比如Set objExcel = GetObject(,「Excel.Application」)'。 – Lankymart

+0

驅車者是否會解釋他們在這個問題上遇到的困難? – EJP

回答

4

GetObject()的使用記錄在this old KB article中。需要錯誤處理才能創建第一個實例。就像這樣:

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 Services是更好的方法。

+0

謝謝。殭屍是由於腳本在不方便的時候被殺死的,這可能是由於各種合法原因而發生的,而這些原因在這裏並不相關。 – EJP

+0

好文章漢斯。 – Lankymart

相關問題