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

如何在vbscript崩溃时关闭应用程序,vbscript,excel.application,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

我正在使用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之前崩溃时,进程将继续保留并锁定文件,直到我手动终止该进程

如何确保即使脚本失败也能执行任何清理例程?

添加错误转到脚本顶部的ErrorHandler,并在脚本底部添加ErrorHandler:。在ErrorHandler标签下面,根据错误号添加代码以管理情况

请参阅MSDN上的对象

您还可以在下一步使用错误恢复。这就是一个例子

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

将错误添加到脚本顶部的ErrorHandler,并在脚本底部添加ErrorHandler:。在ErrorHandler标签下面,根据错误号添加代码以管理情况

请参阅MSDN上的对象

您还可以在下一步使用错误恢复。这就是一个例子


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

问题是/曾经是什么?关于在用于自动化Excel的VBScript崩溃时可靠关闭Excel:

如果你写信

Set oExcel = CreateObject("Excel.Application")
创建一个“简单”变量。VBScript可能会在变量超出范围时减少引用计数器,但肯定不会。请退出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将询问您是否保存您的工作-从而证明.Quit from Class\u Terminate子类确实将Excel踢入byebye模式


该类需要进一步工作基本设置、常用操作保存?before.Quit,可能是为了防止误用Set oExcel=Nothing或其他货物邪教的垃圾,添加th.Obj并不好,如果你在调试器中杀死你的.vbs,它也不会帮助你,但对于标准场景,你将不再看到Excel僵尸。

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

如果你写信

Set oExcel = CreateObject("Excel.Application")
创建一个“简单”变量。VBScript可能会在变量超出范围时减少引用计数器,但肯定不会。请退出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将询问您是否保存您的工作-从而证明.Quit from Class\u Terminate子类确实将Excel踢入byebye模式


该类需要进一步工作基本设置、常用操作保存?before.Quit,可能是为了防止误用Set oExcel=Nothing或其他货物邪教,th.Obj添加并不好,如果在调试器中杀死.vbs,它也不会帮助您,但对于标准场景,您将不再看到Excel僵尸。

为什么脚本会崩溃?无法在错误转到时使用您并从那里优雅地处理事情?它可能崩溃的原因有很多。如果On Error Goto是Java中与try/catch等效的vbscript,那将是一个理想的解决方案。是的,这是处理VBS中错误的方式。@Francis-vbscript中没有On Error Goto。如果在全局范围内应用,则错误恢复下一步的松散等效项是无用的。当“脚本崩溃”时,对选定问题点的本地错误处理将无法保存您。为什么脚本会崩溃?无法在错误转到时使用您并从那里优雅地处理事情?它可能崩溃的原因有很多。如果On Error Goto是Java中与try/catch等效的vbscript,那将是一个理想的解决方案。是的,这是处理VBS中错误的方式。@Francis-vbscript中没有On Error Goto。如果在全局范围内应用,则错误恢复下一步的松散等效项是无用的。当“脚本崩溃”时,对选定问题点的本地错误处理不会为您节省时间。使用包装器类来清理问题是一种很好的方法。错误上的方法似乎只是在悄然发生
删除错误并继续,这将使调试变得困难。使用包装器类来清除错误是一种很好的方法。on-error方法似乎只是静静地忽略错误并继续,这将使调试变得困难。