2015-09-11 33 views
1

,通過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)

回答

3

當你的確切的環境和情況是不可能的,如果沒有插件像DO THINGS ...一個提到,有一些Excel Application object應該能夠被利用來獲得應用程序狀態的一些意義。

似乎是一個可能的候選人是_Application.CalculationState property。如果完全重新計算被迫處理,然後處理Do While...: DoEvents: Loop,僞定時器可能是pausin g powershell腳本,而Application.CalculationState不是xlDone與Internet.Explorer對象非常相似,直到完成接收其網頁爲止。

$xl = new-object -ComObject Excel.Application 
$xl.Calculate 
do while $xl.CalculationState <> xlDone: $xl.DoEvents: Loop 
$xl.quit() 
... (do more things?) 

一個recalulation也可以與_Application.CalculateBeforeSave property如果要保存關閉(隨後退出)之前被迫的。

另一個好的候選人是簡單的_Application.Ready property

$xl = new-object -ComObject Excel.Application 
do while not $xl.ready: $xl.DoEvents: Loop 
$xl.quit() 

查看Application Members (Excel)瞭解可以確定「狀態」的潛在屬性的完整列表。更多信息,請致電Developer’s Guide to the Excel 2010 Application Object

+0

謝謝,Jeeped!在excel之前和之後自由使用'do while $ xl.ready:$ xl.DoEvents:Loop'(在VB中)和/或'while(!$ xl.ready){sleep .1}'(在powershell中)調用'open()','save()','saveas()','quit()'和'Workbooks.Add()'這個技巧! – Jthorpe

相關問題