测试Excel是否已完成其启动/关闭序列

时间:2015-09-11 00:48:07

标签: excel vba powershell com excel.application

我使用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)吗?

0 个答案:

没有答案