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にアクセスして、メッセージをポップアップさせる何かを行います-私の場合、パーティーシャッフルに移動すると、「パーティーシャッフルは自動的に何とか何とか....」というバナーが表示され、「表示しない」メッセージが表示されます。
この時点で、スクリプトを実行するとこれが繰り返される場合:
+ 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 を処理し、成功するまで黙って再試行するように、コードを強化したいと考えています。助言がありますか?