我正在使用PowerShell
通过 COM 自动化一些 excel 任务,通过PowerShell
这样的脚本:
$xl = new-object -ComObject Excel.Application
sleep 5
DO THINGS...
$xl.quit()
sleep 5
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl)
[GC]::collect()
我的问题是,如果我省略第一次调用 to sleep
,Excel 将无法执行需要加载项的任务,并且调用 to$xl.quit()
不起作用,并且进程无法退出,如下所示:
PS > Get-Process EXCEL
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
784 104 104008 109380 944 3.21 5996 EXCEL
同样,如果我省略了对 的第二次调用sleep
,excel 没有时间完成关闭,最终这会导致一个对话框显示“Microsoft Excel 已停止工作......”,下次 Excel 启动时,另一个对话框框显示“Microsoft Excel 无法正常关闭,以安全模式启动?”
function XLtest {
$xl = new-object -ComObject Excel.Application
$xl.quit()
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl)
[GC]::collect()
}
for($i=0;$i -lt 10; $i++){ XLtest } # generates multiple errors
显然,这些是我想避免的问题,但调用的启发式解决方案sleep 5
仍然可能在某些情况下失败。有什么方法可以检测 excel 何时完成其启动序列并准备发出命令(xl.quit()
特别是)以及何时完成关闭序列(即何时可以调用[System....Marshal]::ReleaseComObject($xl)
?