09/20 アプリケーションの状態を調べる
AppleScriptからアプリケーションの状態を調べたい、というニーズは多いようで……検索エンジンのキーワードで割と頻繁に調べられているようです。
個別のノウハウについては本Blog上で紹介していますが、体系的にノウハウを整理したことはないので、ここでまとめて紹介しておきます。
(1)アプリケーションがインストールされているかを調べる
アプリケーションの状態を調べるといっても、それがインストールされていなければ調べようがありません。最初にやるべきなのは、AppleScriptを実行するマシンにコントロール対象のアプリケーションがインストールされているかどうかを確認することです。
アプリケーションの存在確認は、Info.plistに書かれているCFBundleIdentifierを確認する必要があります。

Info.plistの内容確認は、Xcode Toolsをインストールすると一緒にインストールされる、「Property List Editor」で閲覧/編集が可能です。

Property List Editor上でキー値がそのまま表示されていない場合には、メニューの「View」から「Show Raw Keys/Values」を実行するとCFBundleIdentifierを確認できます。


このid値をもとに、Finderに対してapplicaion fileを求めると、インストールされている場合にはそのうち一番新しいバージョンのアプリケーションファイルへのaliasが得られます。
(2)起動中のアプリケーションから情報を取得する
インストールされていることが確認できたら、launchなりactivateのコマンドを送って起動。そののち、起動中のアプリケーションから各種情報を取得する、というのが定石です。
たいていは、アプリケーションのプロパティを取得すれば、アプリケーションが持っている情報が得られます。ただし、ここで得られる情報はアプリケーション側のAppleScript対応度によってまちまちで、バージョン情報やアプリケーション名が分るだけ、というケースもあれば……現在選択中のオブジェクトの情報が分ったり、各種環境設定情報が分る場合もあります。
| スクリプト名:アプリケーションのプロパティを取得する |
| tell application “iPhoto” properties end tell –> {last months album:album id 4.295966298E+9 of application “iPhoto”, selection:{album id 4.295966334E+9 of application “iPhoto”}, photo library album:album id 4.295966296E+9 of application “iPhoto”, name:”iPhoto”, version:”8.1.2″, frontmost:false, class:application, last import album:album id 4.295966297E+9 of application “iPhoto”,……(以下省略) |
さらに、アプリケーションのプロパティを複数まとめて「properties」で取得できないアプリケーション(iTunesなど)もあるため、そういう場合にはAppleScript用語辞書をしらべて、ひとつひとつプロパティ値を取得する必要があります。
(3)System Events経由でプロセス情報を調べる
アプリケーションに対して直接問い合わせを行った場合に、環境設定情報やドキュメントの情報は取得できますが、アプリケーションプロセス自体の情報はあまり調べられません。
そこで、アプリケーション本体ではなく、System Eventsにプロセス情報を確認することになります。
| スクリプト名:System Evewntsで指定IDのプロセスの状態を調べる |
| tell application “System Events” set pList to properties of first item of (every process whose bundle identifier = “com.apple.iPhoto”) end tell –>{enabled:missing value, unix id:46789, file:alias “Cherry:Applications:iPhoto.app:”, creator type:”iPho”, subrole:missing value, entire contents:{}, selected:missing value, application file:alias “Cherry:Applications:iPhoto.app:”, orientation:missing value, role:”AXApplication”, accepts high level events:true, file type:”APPL”, value:missing value, position:missing value, id:20128561, displayed name:”iPhoto”, name:”iPhoto”, class:application process, background only:false, frontmost:false, size:missing value, visible:true, Classic:false, role description:”アプリケーション”, maximum value:missing value, architecture:”i386″, partition space used:0, short name:”iPhoto”, focused:missing value, minimum value:missing value, help:missing value, title:”iPhoto”, accepts remote events:false, description:”アプリケーション”, total partition size:0, accessibility description:missing value, has scripting terminology:true, bundle identifier:”com.apple.iPhoto”} |
ここでは、CFBundleIdentifierによってプロセスの特定を行っていますが、Mac OS X上で気をつけるべき点があります。たとえば、Adobe Illustratorであれば……複数の異なるバージョンをインストールして、同時に複数バージョンを起動しているケースがあるということです。
そのため、厳密にアプリケーションプロセスを指定する場合には、バージョン情報なども指定する必要も出てくることでしょう。
ただし、System Eventsから取得する意義があるのは、アプリケーションが最前面にあるかどうかを示す「frontmost」、可視状態になっているかどうかを示す「visible」、そしてUNIXから見た場合のプロセスIDである「unix id」ぐらいです。
unix idを取得できれば、あとはshellのpsコマンドをdo shell scriptコマンド経由で実行し(ps -lp [process id])アプリケーションプロセスの状態を調べられます。
ここまでくれば、PhotoshopだろうがiPhotoだろうがPreviewだろうが、単なるUNIXのプロセスとして扱えます。killするなりゾンビプロセスになっていないか調べるなり、CPUへの負荷状態を調べたりできることになります。
だいたい、AppleScriptでアプリケーションプロセスの「状態」を調べるノウハウというのは、こんな感じです。
