,通過PowerShell
腳本像這樣:測試Excel是否已完成我使用<code>PowerShell</code>自動執行某些擅長通過COM任務的啓動/停止序列
$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
的啓發式解決方案仍然可能無法在OCASION。有沒有什麼辦法可以檢測出什麼時候excel完成啓動序列,並準備發出命令(特別是xl.quit()
),並且當關閉序列完成時(即可以撥打電話[System....Marshal]::ReleaseComObject($xl)
?
謝謝,Jeeped!在excel之前和之後自由使用'do while $ xl.ready:$ xl.DoEvents:Loop'(在VB中)和/或'while(!$ xl.ready){sleep .1}'(在powershell中)調用'open()','save()','saveas()','quit()'和'Workbooks.Add()'這個技巧! – Jthorpe