我使用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()
我的问题是,如果我省略了对sleep
的第一次调用,则Excel无法执行需要加载项的任务,并且对$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)
吗?