How to close an application when vbscript crashes

时光怂恿深爱的人放手 提交于 2019-11-27 03:42:06

问题


I'm using VBscript to open Microsoft Excel and convert xls documents to csv.
Here is a quick example that takes an argument and converts the first page

Dim oExcel
Dim oBook
Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Open(Wscript.Arguments.Item(0))

oBook.SaveAs "out.csv", 6

oBook.Close False
oExcel.Quit

If everything works, that's great. But when the script crashes before it can close excel, the process continues to stay around and lock the file until I manually kill the process.

How can I make sure that I perform any clean up routines even when the script fails?


回答1:


Add "On Error Goto ErrorHandler" at the top of your script, and at the bottom of it, add "ErrorHandler:". Underneath the ErrorHandler label add code to manage the situation depending on the Err.Number

See Err object on MSDN.

You can also use "On Error Resume Next". Here is an example.

EDIT: My bad. "Goto" does not exist in VBS. The answer below is probably a much tidier approach.




回答2:


As the question is/was? about closing Excel reliably when the VBScript used to automate it crashes:

If you write

Set oExcel = CreateObject("Excel.Application")

you create a 'simple' variable. VBScript may decrement a ref counter when the variable goes out of scope, but it certainly won't .Quit Excel for you.

If you want a feature like atexit calls or exception handling in VBScript, you'll have to write a class that 'does what I mean' in its Class_Terminate Sub. A simple example:

Option Explicit

Class cExcelWrapper
  Private m_oExcel
  Public Sub Class_Initialize()
    Set m_oExcel = CreateObject("Excel.Application")
  End Sub
  Public Sub Class_Terminate()
    m_oExcel.Quit
  End Sub
  Public Default Property Get Obj()
    Set Obj = m_oExcel
  End Property
End Class

Dim oExcel : Set oExcel = New cExcelWrapper
Dim oWBook : Set oWBook = oExcel.Obj.WorkBooks.Add()

oExcel.Obj.Visible = True
oExcel.Obj.DisplayAlerts = False
oWBook.Sheets(1).Cells(1,1) = "Div by Zero"

WScript.Echo "Check TaskManager & Enter!"
WScript.StdIn.ReadLine
WScript.Echo 1 / 0

(meant to be started with "cscript 20381749.vbs")

If you run this script with an open Taskmanager, you'll see Excel popup in the processes list (and on the screen, because of .Visible). If you then hit Enter, the script will abort with an "Division by Zero" error and the Excel process will vanish from the Processes list.

If you remove the .DisplayAlerts setting, Excel will ask you whether to save your work or not - proving thereby that the .Quit from the Class_Terminate() Sub really kicks Excel into byebye mode.

The class needs further work (basic settings, common actions (save?) before .Quit, perhaps a guard against misuse (Set oExcel = Nothing or other cargo cult crap), th .Obj addition isn't nice, and it won't help you if you kill your .vbs in a debugger, but for standard scenarios you won't see Excel zombies anymore.



来源:https://stackoverflow.com/questions/20381749/how-to-close-an-application-when-vbscript-crashes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!