我正在使用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之前崩溃时,进程会继续保持并锁定文件,直到我手动终止进程。
即使脚本失败,我怎样才能确保执行任何清理程序?
答案 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)