Я использую PowersHell для автоматизации iTunes, но обнаружил, что обработка ошибок / ожидание обработки com-объектов меньше оптимальной.
Пример кода
#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 и сделайте что-нибудь, из-за чего появится всплывающее сообщение - в моем случае я захожу в Party Shuffle и получаю баннер "Party shuffle автоматически бла-бла-бла ...." с сообщением "Не отображать" .
На этом этапе при запуске сценария это будет повторяться:
+ 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)) {
Это будет потому, что дескриптор $ Library недействителен.
Если в моем примере выполнялось что-то важное - например, преобразование треков с последующим удалением старых, неправильная обработка ошибки может быть фатальной для треков в itunes.
Я хочу укрепить код так, чтобы он обрабатывал iTunes, и он будет повторять попытки до тех пор, пока он не будет успешным. Есть предложения?