我正在使用PowersHell來自動化iTunes,但發現錯誤處理/等待com對象處理不夠理想。在PowerShell自動化期間RPC_E_SERVERCALL_RETRYLATER
示例代碼
#Cause an RPC error
$iTunes = New-Object -ComObject iTunes.Application
$LibrarySource = $iTunes.LibrarySource
# Get "playlist" objects for main sections
foreach ($PList in $LibrarySource.Playlists)
{
if($Plist.name -eq "Library") {
$Library = $Plist
}
}
do {
write-host -ForegroundColor Green "Running a loop"
foreach ($Track in $Library.Tracks)
{
foreach ($FoundTrack in $Library.search("$Track.name", 5)) {
# do nothing... we don't care...
write-host "." -nonewline
}
}
} while(1)
#END
走進iTunes和做一些事情,使得它彈出一個消息 - 在我的情況下,我進入了派對隨機播放和我的一面旗幟「派對隨機播放自動等等等等...... 「帶有」不顯示「消息。
此時如果運行該腳本會做這樣反覆:
+ foreach ($FoundTrack in $Library.search(<<<< "$Track.name", 5)) {
Exception calling "Search" with "2" argument(s): "The message filter indicated
that the application is busy. (Exception from HRESULT: 0x8001010A (RPC_E_SERVER
CALL_RETRYLATER))"
At C:\Documents and Settings\Me\My Documents\example.ps1:17 char:45
+ foreach ($FoundTrack in $Library.search(<<<< "$Track.name", 5)) {
Exception calling "Search" with "2" argument(s): "The message filter indicated
that the application is busy. (Exception from HRESULT: 0x8001010A (RPC_E_SERVER
CALL_RETRYLATER))"
At C:\Documents and Settings\Me\My Documents\example.ps1:17 char:45
如果你等到你你運行的例子,然後收到了一個對話框,而不是你會反覆得到這樣的:
Running a loop
You cannot call a method on a null-valued expression.
At C:\Documents and Settings\Me\example.ps1:17 char:45
+ foreach ($FoundTrack in $Library.search(<<<< "$Track.name", 5)) {
這將是因爲$庫句柄無效。
如果我的例子做了一些重要的事情 - 比如轉換曲目然後刪除舊曲目,不正確處理錯誤可能會對iTunes中的曲目造成致命的影響。 我想強化代碼,以便它可以處理iTunes正在忙碌的事情,並會默默重試,直到成功爲止。有什麼建議麼?
不幸的是,它不會像睡覺一樣簡單,因爲我的真實腳本根據對象結果執行大量嵌套操作。我想我可以把所有東西都放到它們自己的功能上,並把陷阱包裹在它們周圍,但是......我希望能夠做一個簡單的foreach工作方式。 – 2008-10-10 07:11:27