如何在vbscript崩溃时关闭应用程序

时间:2013-12-04 17:18:22

标签: vbscript excel.application

我正在使用VBscript打开Microsoft Excel并将xls文档转换为csv 这是一个快速示例,它接受一个参数并转换第一页

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

如果一切正常,那就太棒了。但是当脚本在关闭excel之前崩溃时,进程会继续保持并锁定文件,直到我手动终止进程。

即使脚本失败,我怎样才能确保执行任何清理程序?

2 个答案:

答案 0 :(得分:5)

问题是/是吗?关于在用于自动化的VBScript崩溃时可靠地关闭Excel:

如果你写

Set oExcel = CreateObject("Excel.Application")

你创建一个'简单'变量。当变量超出范围时,VBScript可能会减少ref计数器,但它肯定不会。为你准备Excel。

如果你想在VBScript中使用像atexit调用或异常处理这样的功能,你必须在其Class_Terminate Sub中编写一个“尽我所能”的类。一个简单的例子:

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

(意味着以“cscript 20381749.vbs”开头)

如果您使用打开的Taskmanager运行此脚本,您将在进程列表中看到Excel弹出窗口(并且在屏幕上,因为.Visible)。如果您按Enter键,脚本将以“除以零”错误中止, Excel进程将从“进程”列表中消失。

如果删除.DisplayAlerts设置,Excel将询问您是否保存您的工作 - 从而证明来自Class_Terminate()Sub的.Quit真正将Excel踢入byebye模式。

班级需要进一步的工作(基本设置,常见操作(保存?)之前.Quit,也许是防止滥用(设置oExcel = Nothing或其他货物崇拜垃圾),th .Obj添加不是很好,它如果您在调试器中杀死.vbs,将无法帮助您,但对于标准方案,您将不再看到Excel僵尸。

答案 1 :(得分:0)

在脚本顶部添加"On Error Goto ErrorHandler",在其底部添加“ErrorHandler:”。在ErrorHandler标签下方添加代码以根据Err.Number

管理情况

请参阅MSDN上的Err对象。

您也可以使用“On Error Resume Next”。 Here就是一个例子。

编辑:我的坏。 VBS中不存在“Goto”。下面的答案可能是一个更整洁的方法。