Archive for the 'プロセス関連(process)' Category

2017/09/26 バンドルIDで指定したプロセスを強制終了

Bundle IDで指定したプロセスを強制終了するAppleScriptです。

実際に試してみたらshellのkill/killallコマンドなどと異なり、Finderを強制終了したら終了しっぱなしになりました。

FinderをkillしてFinderがわりのアプリケーションを起動しておく用途のために必要な機能です。

AppleScript名:バンドルIDで指定したプロセスを強制終了(NSRunningApplication)
– Created 2017-09-17 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”
–http://piyocast.com/as/archives/4847

set pRes to forceQuitAProcessByBUndleID(“com.apple.finder”) of me

–指定プロセスの強制終了
on forceQuitAProcessByBUndleID(aBundleID)
  set appArray to current application’s NSRunningApplication’s runningApplicationsWithBundleIdentifier:aBundleID
  
if appArray’s |count|() > 0 then
    set appItem to appArray’s objectAtIndex:0
    
set aRes to (appItem’s terminate()) as boolean
    
return aRes
  else
    return false
  end if
end forceQuitAProcessByBUndleID

★Click Here to Open This Script 

2017/03/16 Dockとメニューバーを隠す→戻す

メニューバーとDockを隠して10秒たったら元に戻すAppleScriptです。

隠すことが目的で、元に戻すのは単なる後片付けです。

Objective-Cの「|」記号がORであることを忘れてしばらく考えてしまいましたが、ORだとわかればEnumを加算して数値で指定すればいいだけなので、パラメータを直接数値で指定しました。

AppleScript名:Dockとメニューバーを隠す→戻す
– Created 2017-03-15 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”
–http://piyocast.com/as/archives/4529

–Main MenuとDockを隠す
current application’s NSApplication’s sharedApplication()’s setPresentationOptions:10 –NSApplicationPresentationHideMenuBar | NSApplicationPresentationHideDock

delay 10

–MenuとDockを通常に戻す
current application’s NSApplication’s sharedApplication()’s setPresentationOptions:(current application’s NSApplicationPresentationDefault)

★Click Here to Open This Script 

2017/02/27 指定Bundle IDのプロセス存在確認(ASOC)v3

Bundle IDで指定したアプリケーションプロセスが起動中かどうかを調べるAppleScriptです。

よく書いては書き捨てるレベルの、素朴な機能のScriptです。Cocoaの機能を呼び出すAppleScriptObjCにだんだん書きなれてきて、

 ・Cocoaの機能を積極的に利用する
 ・ループや条件判断を利用しないで書く
 ・Cocoaらしい記述を利用して書く

という記述方法がわかってきたような気がします(わかった、とは言いません)。

 ・指定Bundle IDのプロセス存在確認(ASOC)(v1)
 ・起動中のプロセスの存在確認(ASOC)v2
 

AppleScript名:指定Bundle IDのプロセス存在確認(ASOC)v3
– Created 2015-02-08 by Takaaki Naganoya
– Created 2017-02-26 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"
–http://piyocast.com/as/archives/4486

set aRes to chkAppProcesByBundleID("com.apple.iWork.Keynote")
–> true

on chkAppProcesByBundleID(aBundleID as string)
  set procArray to current application’s NSWorkspace’s sharedWorkspace’s runningApplications()’s valueForKeyPath:"bundleIdentifier"
  
return (procArray’s containsObject:aBundleID) as boolean
end chkAppProcesByBundleID

★Click Here to Open This Script 

2016/05/17 Duet DisplayのMac側プロセスの死活判定を定期的に実行

iOS用のDuet Displayは、iOSデバイスをUSB経由でMac/Windows機とつなぎ、iOSデバイスを外部ディスプレイ化するアプリです。

AppStoreで1,900円(記事作成時現在の価格)でiOSアプリを購入+インストール、Mac側にはDuet Displayのホームページから無料ダウンロード可能なツールをインストールします。

このDuet Displayを使って、ちょっと使い道のなかったiPadなどをMacのサブディスプレイにすることができます。以前は、Air Displayを使って無線LAN経由でiPadを外部ディスプレイ化してもみましたが、パフォーマンスがいまいちなうえにソフトウェアの安定性が残念なレベルだったので使用をやめてしまいました。

img_3577_resized.png

Duet Displayはさすがにゲームを快適に行えるほどではありませんが、ちょっとした用途であれば違和感なく使えるパフォーマンス。

3・4日ほどは便利に使っていたものの、途中でMac側のduetプロセスがコケたりして、急にディスプレイ表示が消える現象に直面。サブディスプレイとして使っている場合には冗談ぐらいで済みますが、メインディスプレイとして使っていた場合には悲惨です(メインディスプレイとして使ってほしくない雰囲気)。

いろいろ実験(長期間起動させっぱなしとか、スリープからの回復を連続して行うとか)を行ったところ、duetプロセスが落ちることは避けられないという結論に至りました(落ちるものは落ちる)。

そこで、Mac側のduetプロセスの死活判定を定期的に行い、死んでいた場合には起動し直すAppleScriptアプレットを作って運用してみました。このプロセス死活判定は、以前に作成したものを使いまわしたため、プログラムはほぼ2〜3行追加しただけです。

このような仕組みを用意したおかげで、iPadをMac miniのメインディスプレイに設定して、duetプロセスがコケて表示が消えても自動で表示が回復するようになりました。idleハンドラ内のタイマー割り込み時間(秒)を現在は10秒にしていますが、もうちょっと短い間隔でチェックしてもよいと思います。

本AppleScriptはスクリプトエディタで「アプリケーション」として保存し、オプションで「ハンドラの実行後に終了しない」を指定することで立ち上げっぱなしの運用が可能です。また、Dock上から「ログイン時に開く」にチェックすることで、電源オン時→ログイン時に自動起動されるため、おすすめです。

AppleScript名:restartDuet
on run
  idle
end run

on idle
  set aRes to detectAppAliveByID(“com.kairos.duet”) of me
  
if aRes is not equal to true then
    tell application id “com.kairos.duet” to launch
  end if
  
return 10
end idle

–指定プロセスの死活判定(Bundle IDで判定)
on detectAppAliveByID(aProcBundleID)
  set aProcBundleID to aProcBundleID as string
  
  
–Phase 1 psコマンド経由で状態を確認してみる
  
set aRes to false
  
try
    tell application “System Events”
      set aList to bundle identifier of every process
      
if aProcBundleID is in aList then
        
        
set tmpList to name of every process whose bundle identifier = aProcBundleID
        
set aProcName to contents of first item of tmpList
        
        
set aRes to true
        
tell process aProcName
          set processID to unix id –プロセスIDを取得
        end tell
        
        
set processID to processID as string
        
        
–指定プロセスがゾンビプロセス化しているかどうかを判定
        
set procState to (words of (do shell script “/bin/ps “ & processID & ” | cut -d ’ ’ -f 6″)) as string
        
        
if procState contains “Z” then
          –ゾンビプロセスを殺す
          
do shell script “/bin/kill -9 “ & processID
          
return “killed”
        end if
      else
        –指定したBundle IDのプロセスが存在しない場合falseでリターン
        
return false
      end if
    end tell
  on error
    –異常発生時にはさっさとリターン
    
return false
  end try
  
  
–Phase 2 指定アプリに直接コンタクトして反応を見る
  
try
    with timeout of 3 seconds
      tell application id aProcBundleID
        set aTmpvar to name –これができない(Scriptableな)アプリはほとんどないだろう(多分)
      end tell
    end timeout
  on error
    –名称を取得できなかった場合にはコケていると見なしてプロセスを殺す
    
do shell script “/bin/kill -9 “ & processID
    
return “killed”
  end try
  
  
return aRes
end detectAppAliveByID

★Click Here to Open This Script 

2015/10/22 アプレットのアイコンをDockに出さない

Cocoaの機能を用いて、Dockにアイコン非表示状態のAppleScriptアプレットにする方法です。

一番有名なのは、Info.plistに”LSBackgroundOnly”=”1″のエントリを作成する方法ですが、Cocoaの機能を用いて、アプレットの起動後にアイコンを非表示状態にすることが可能です。

通常のAppleScript Appletを前提にして話をします。

本記事中のプログラムリストは、アプレット(Applet)に書き出した状態で実行してください。Script Editor上で実行しても意味がありません。

export_to_applet.png

export_to_applet2.png

exported_applet.png

通常のAppleScript Appletでは、Cocoa-AppleScript Applet(OS X 10.7で採用になったもの)と異なり、起動時の細かいイベントハンドラは利用できないため、Appletが起動してコードが実行されるまでの間、「ちょっとの間だけ」Dock上にアイコンが表示されます。

cocoa_applescript_applet.png

プロセスの隠し方が2通りあります。

 NSApplicationActivationPolicyAccessory:display dialog実行可能
 NSApplicationActivationPolicyProhibited:display dialog実行不可。display notificationやsayコマンドなどは実行可能

それぞれ、用途に応じて使ってみてください。また、状態を途中で変更することも可能で、通常のアプレットのようにDock表示状態に戻すこともできます。

AppleScript名:アプレットのアイコンをDockに出さない
– Created 2015-10-22 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

–Dockアイコン非表示、dialogは出せる
current application’s NSApp’s setActivationPolicy:(current application’s NSApplicationActivationPolicyAccessory)
repeat with i from 1 to 10
  tell current application
    display dialog (i as text) giving up after 1 with icon 1 buttons {“OK”}
  end tell
end repeat
quit

★Click Here to Open This Script 

AppleScript名:アプレットのアイコンをDockに出さない2
– Created 2015-10-22 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

–Dockアイコン非表示、dialogも出ない
current application’s NSApp’s setActivationPolicy:(current application’s NSApplicationActivationPolicyProhibited)
repeat with i from 1 to 10
  tell current application
    display notification (i as text)
    
delay 1
  end tell
end repeat
quit

★Click Here to Open This Script 

AppleScript名:アプレットのアイコンをDockに出さない→出す
– Created 2015-10-22 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

–Dockアイコン非表示、dialogは出せる
current application’s NSApp’s setActivationPolicy:(current application’s NSApplicationActivationPolicyAccessory)
repeat with i from 1 to 10
  tell current application
    display dialog (i as text) giving up after 1 with icon 1 buttons {“OK”}
  end tell
end repeat

–通常状態
current application’s NSApp’s setActivationPolicy:(current application’s NSApplicationActivationPolicyRegular)
repeat with i from 1 to 10
  tell current application
    display dialog (i as text) giving up after 1 with icon 1 buttons {“OK”}
  end tell
end repeat

★Click Here to Open This Script 

2015/02/08 起動中のプロセスの存在確認(ASOC)v2

Bundle IDで指定したアプリケーションプロセスが起動中かどうかを調べるAppleScriptです。

v1は「とりあえずこんなもんで動くだろー。でももっと短く書けそう」というものでしたが、やっぱり短く書けました。Shane Stanleyからチェックが入って(汗)、もっと短く書けるよ、とのこと。感謝です(^ー^)

AppleScript名:指定Bundle IDのプロセス存在確認(ASOC)v2
– Created 2015-02-08 by Shane Stanley
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “ASObjCExtras”
use framework “AppKit”

set aRes to chkAppProcesByBundleID(“com.adobe.Photoshop”)
–> true

set aRes to chkAppProcesByBundleID(“com.adobe.Photoshopoo!”)
–> false

on chkAppProcesByBundleID(aBundleID)
  set appArray to current application’s NSRunningApplication’s runningApplicationsWithBundleIdentifier:aBundleID
  
return (appArray’s |count|() > 0)
end chkAppProcesByBundleID

★Click Here to Open This Script 

2015/02/08 起動中のプロセスの存在確認

Bundle IDで指定したプロセスが起動しているかどうかを確認するAppleScriptです。

AppleScript的には、System Eventsを経由してプロセスの起動中確認を行います。

AppleScript名:指定Bundle IDのプロセス存在確認(AS)
use AppleScript version “2.4″
use scripting additions

set aRes to chkAppProcesByBundleID(“com.adobe.Photoshop”)
–> true

set aRes to chkAppProcesByBundleID(“com.adobe.Photoshopoo!”)
–> false

on chkAppProcesByBundleID(aBundleID as string)
  tell application “System Events”
    set a to every process whose bundle identifier is aBundleID
    
if length of a 1 then
      return true
    else
      return false
    end if
  end tell
end chkAppProcesByBundleID

★Click Here to Open This Script 

しかし、この方法ではもしもMac App Storeに申請するアプリケーションで、System Eventsへのアクセスが封じられたらおしまいです。一応、shell script経由でpsコマンドを実行するという手段もありますが・・・

そこで、ASOCでCocoaの機能を用いてプロセスの存在確認を行ってみました。もうちょっと短く書けそうな気配もするのですが、とりあえず。

AppleScript名:指定Bundle IDのプロセス存在確認(ASOC)
– Created 2015-02-08 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “ASObjCExtras”
use framework “AppKit”

set aRes to chkAppProcesByBundleID(“com.adobe.Photoshop”)
–> true

set aRes to chkAppProcesByBundleID(“com.adobe.Photoshopoo!”)
–> false

on chkAppProcesByBundleID(aBundleID as string)
  set appArray to current application’s NSWorkspace’s sharedWorkspace’s runningApplications()
  
set appList to appArray’s ASify() as list
  
  
repeat with i in appList
    set anID to (i’s bundleIdentifier()) as string
    
if anID = aBundleID then
      return true
    end if
  end repeat
  
  
return false
end chkAppProcesByBundleID

★Click Here to Open This Script 

2014/12/12 バージョン番号文字列からメジャーバージョンを求める v2v3

バージョン番号文字列(”10.10.1”とか”4.1.1”とか)から、メジャーバージョン番号の数値(10とか4とか)を求めるAppleScriptです。

最初のバージョンでは、アプリケーション名称(display name)と本当の名称(プロセス名)が異なるものについては、AppleScript側から「これはなんですか?」といちいち聞かれていたので、nameではなくBundle IDを取得してバージョン番号を求めるようにしてみました(Safariだけ確認したかったので、最初のバージョンは手抜き感が、、、visible processのみ処理していたのは、手抜きゆえに ^ー^;;)。

しかも、本ルーチン・・・作っていたシステムで「バージョンを確認しなくてもいい処理方法」を見つけたので、おクラ入りしたモノだったり。いつか、使うことになる日もくるでしょう、きっと。

AppleScript名:バージョン番号文字列からメジャーバージョンを求める v2
tell application “System Events”
  set bList to bundle identifier of every process whose visible is true
  
set nList to name of every process whose visible is true
end tell

set nnList to somelistAdd({nList, bList}) of me

set vList to {}
repeat with i in nnList
  set {aName, aBundleID} to contents of i
  
tell application id aBundleID
    set aVerStr to version
  end tell
  
set the end of vList to {aName, getMajorVersionNum(aVerStr) of me}
end repeat

return vList
–> {{”Finder”, 10}, {”Activity Monitor”, 10}, {”DragThing”, 5}, {”Keynote”, 6}, {”Safari”, 8}, {”Calendar”, 8}, {”Mail”, 8}, {”ASObjC Explorer 4″, 4}, {”iTunes”, 12}, {”Script Editor”, 2}, {”UI Browser”, 2}, {”Skim”, 1}}

–バージョンNo文字列のメジャー番号を取得する
on getMajorVersionNum(vString)
  set aPos to offset of “.” in vString
  
if aPos = 0 then
    set vStr to vString
  else
    set vStr to text 1 thru (aPos - 1) of vString
  end if
  
  
try
    set vNum to vStr as number
  on error
    return false
  end try
  
  
return vNum
end getMajorVersionNum

–複数のリストを合成
–すべて同じ要素数である必要がある。また、複数のリストを{aList,bList,cList}とペアにして
–本ルーチンに渡す必要がある
on somelistAdd(aList)
  set aCount to count every item of aList
  
–> 3
  
  
–渡された入れ子リスト内の各要素の数が同じかどうかチェック
  
set countList to {}
  
repeat with i from 1 to aCount
    set bCount to count every item of item i of aList
    
set the end of countList to bCount
  end repeat
  
–> {3, 3, 3}
  
set {aResF, aResN} to retSameEveryItem(countList) of me
  
if aResF = false then return –合成する要素内の要素数が合っていなかったら処理を行わない
  
  
–合成を行う
  
set newList to {}
  
repeat with i from 1 to aResN
    set anItem to {}
    
repeat with ii from 1 to aCount
      set jj to contents of (item i of item ii of aList)
      
set the end of anItem to jj
    end repeat
    
set the end of newList to anItem
  end repeat
  
  
return newList
end somelistAdd

–リスト中の全要素が同じかどうかをbooleanで返す
on retSameEveryItem(aList)
  set a to item 1 of aList
  
set aList to rest of aList
  
set aFlag to true
  
repeat with i in aList
    if a is not equal to contents of i then
      set aFlag to false
      
exit repeat
    end if
  end repeat
  
return {aFlag, a} –Booleanとそのデータを返す
end retSameEveryItem

★Click Here to Open This Script 

で、Shaneからツッコミがあって「こっちのほうがいいよ」と送ってもらったのがこちらです(^ー^;

AppleScript名:バージョン番号文字列からメジャーバージョンを求める v3
– Created 2014-12-12 by Shane Stanley
– 2014 Shane Stanley
use AppleScript version “2.3.1″
use scripting additions
use framework “Foundation”
use framework “AppKit”

set theProcesses to current application’s NSWorkspace’s sharedWorkspace()’s runningApplications() as list
set theResult to {}

repeat with aProcess in theProcesses
  set anNSURL to aProcess’s bundleURL()
  
  
if anNSURL is not missing value then
    set theNSBundle to (current application’s NSBundle’s bundleWithURL:anNSURL)
    
    
if theNSBundle is not missing value then
      set theVersionString to ((theNSBundle’s infoDictionary())’s objectForKey:“CFBundleShortVersionString”)
      
      
if theVersionString is not missing value then
        set end of theResult to {aProcess’s localizedName() as text, (theVersionString’s componentsSeparatedByString:“.”)’s firstObject()’s integerValue()}
      end if
      
    end if
  end if
  
end repeat

return theResult

–> {{”loginwindow”, 9}, {”SystemUIServer”, 1}, {”Dock”, 1}, {”AirPlayUIAgent”, 2}, {”Finder”, 10}, {”Spotlight”, 1}, {”com.apple.internetaccounts”, 1}, {”CoreServicesUIAgent”, 134}, {”com.apple.dock.extra”, 1}, {”日本語入力プログラム”, 5}, {”アクティビティモニタ”, 10}, {”Folder Actions Dispatcher”, 1}, {”", 1}, {”QuickRes”, 4}, {”TISwitcher”, 1}, {”通知センター”, 1}, {”Keychain Circle Notification”, 1}, {”DragThing”, 5}, {”Colors for Hue”, 1}, {”EventScripts”, 1}, {”AAM Updates Notifier”, 8}, {”iCloud フォト”, 2}, {”AdobeIPCBroker”, 5}, {”universalAccessAuthWarn”, 1}, {”Wi-Fi”, 1}, {”System Events”, 1}, {”DragThing Helper”, 1}, {”Core Sync”, 1}, {”LaterAgent”, 1}, {”メール”, 8}, {”Mail Web コンテンツ”, 10600}, {”com.apple.MailServiceAgent”, 8}, {”AppleSpell.service”, 2}, {”Mail Web コンテンツ”, 10600}, {”Safari”, 8}, {”Safari Web コンテンツ”, 10600}, {”Safari Networking”, 10600}, {”スクリプトエディタ”, 2}, {”ASObjC Explorer 4″, 4}, {”ASObjCExplorerUIRunner”, 1}}

★Click Here to Open This Script 

2014/07/23 Script Editorで最前面のアプリの用語辞書を表示する v3

AppleScriptエディタ/Script Editorで、最前面のアプリの用語辞書を表示するAppleScriptです。

バージョンアップして、最前面のアプリがAppleScript等のOSA(Open Scripting Architecture)言語によるScriptingに対応しているかどうかを判定したのちに、辞書のオープンを行います。

Script Menuに入れて、メニューから呼び出すことを前提としています。

前バージョンでは、とくに対象アプリケーションのScripting対応については調べていなかったため、非対応アプリを指定すると、Script Editorで対象アプリをバイナリモードでオープンしてしまうなどの問題があり、それに対処したものです。

本AppleScriptは、各アプリケーションのバンドル中にあるInfo.plistを走査してOSA対応の判定を行っていますが、これは「NSAppleScriptEnabled」のエントリがInfo.plist上に存在した場合、慣習的に「true」しか指定されていない(そもそも非対応である場合にはNSAppleScriptEnabledのエントリそのものを作らない)ことから、「NSAppleScriptEnabled」が入っていれば対応……という「手抜き判定」をやっています。

真剣に作るのであれば、NSAppleScriptEnabledのエントリを取得して属性値がどうなっているか判定すべきです。

スクリプト名:Script Editorで最前面のアプリの用語辞書を表示する v3
–最前面のプロセスのファイルシステム上の位置を取得してaliasに変換する
tell application “System Events”
  set frontProc to every process whose frontmost is true and visible is true
  
set aProc to contents of first item of frontProc
  
set aFile to file of aProc
  
set aBundleID to bundle identifier of aProc
end tell

set aFile to aFile as alias

–バンドルパッケージ中のInfo.plistファイルを走査してAppleScript対応かどうかを調べる
set aFilePosix to quoted form of POSIX path of aFile
set infoPath to aFilePosix & “Contents/Info.plist”
set aRec to extractInfoPlistAndFindString(infoPath, “NSAppleScriptEnabled”)

–スクリプト用語辞書をScript Editorでオープンする手順
if aRec = true then
  –OS X 10.10でScript Editor側からアプリをオープンしてもダメだったので、Finder側からScript Editorで指定アプリをオープンすることに
  
tell application “Finder”
    set apFile to (application file id “com.apple.scripteditor2″) as alias
    
open aFile using application file apFile
  end tell
else
  tell application id aBundleID
    display dialog “本アプリケーションは、各種OSA言語によるコントロールに対応していません。” buttons {“OK”} default button 1 with icon 2 with title “Scripting非対応”
  end tell
end if

–指定のInfoPlist(たぶん)をextractして指定文字列を含んでいるかチェック
on extractInfoPlistAndFindString(aPosix, findStr)
  
  
try
    set a to (do shell script “/usr/bin/plutil -p “ & aPosix)
  on error
    return 0 –エラー(指定のパスにファイルが存在しない)
  end try
  
  
set b to (a contains findStr)
  
return b
  
end extractInfoPlistAndFindString

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2013/03/16 指定のバンドルIDのアプリを指定数起動 v1

海外のWebで、openコマンド経由で指定プロセスを複数起動する、という記事がありました

do shell scriptコマンド1行の、素材そのままの内容だったので、ちょっと手を入れて指定数のプロセスを起動できるようにしてみました。

元記事は「Run Multiple Instances Of Any App On Your Mac With An AppleScript」となっていましたが、実際に試してみたところすべて可能というわけではありませんでした。

multi1.png

multi2.png

multi3.png

たとえば、Photoshop CS6とかIllustrator CS5は複数起動できましたが、InDesign CS3は複数起動できませんでした。このあたり、バージョンの問題なのか、アプリの性質の問題なのかよく分らないのですが…………。

追記:InDesign CS6で複数起動を試みましたが、複数起動はブロックされていました

複数のプロセスから設定ファイル(1つあるいは複数)を共有してしまうはずなので、はっきり言って(排他制御とか、書き込んだデータ内容が矛盾したりしないか)「大丈夫なの?」という感想しか持っていないのですが、とりあえず起動できることは起動できています。

最大の問題は、複数起動してもAppleScriptからそれらを個別にコントロールできないので、AppleScript的にはほとんど無意味だということです。残念。あと、複数起動するとそれなりにメモリを喰われます。

スクリプト名:指定のバンドルIDのアプリを指定数起動 v1
launchMultipleINstance(“com.adobe.photoshop”, 3) of me

–指定のバンドルIDのアプリを指定数起動
on launchMultipleINstance(appBundleID, n)
  
  
tell application “Finder”
    set anAppFile to (application file id appBundleID) as alias
  end tell
  
  
set anAppFilePath to anAppFile as string
  
if anAppFilePath ends with “:” then
    set anAppFilePath to text 1 thru -2 of anAppFilePath
  end if
  
  
set appPosixPath to quoted form of POSIX path of anAppFilePath
  
  
repeat n times
    do shell script “/usr/bin/open -n “ & appPosixPath
  end repeat
  
end launchMultipleINstance

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2013/01/16 指定プロセスの死活判定 v2

指定プロセス(アプリケーション)がハングアップしているかどうかをUNIX的な見地と、AppleScript的な見地から判定するAppleScriptです。

以前掲載したバージョンでは、shellのpsコマンドだけで「クラッシュした」状態を検出していましたが、それだけでは不十分という話を書いていました。

そこで、2フェーズに分けて……

 フェーズ1:psコマンドでゾンビプロセスの確認
 フェーズ2:AppleScriptから指定アプリに名称確認

という確認をするようにしてみました。

これだけ丁寧にきめ細かく確認を行えば、たいていのクラッシュやハングアップ状態は検出できることでしょう(あいにく、Mac OS X上ではそんなに頻繁にそういう状態に遭遇していないので確認が難しいのですが)。ぜひ、いろいろなケースで試してみたいところです。

スクリプト名:指定プロセスの死活判定(Bundle IDで判定) v2
set aRes to detectAppAliveByID_(“com.apple.itunes”)
–> true (起動中、ゾンビ化していない)
–> false(起動していない)
–> “killed”(ゾンビ化していたので、killした)

–指定プロセスの死活判定(Bundle IDで判定)
on detectAppAliveByID_(aProcBundleID)
  set aProcBundleID to aProcBundleID as string
  
  
–Phase 1 psコマンド経由で状態を確認してみる
  
set aRes to false
  
try
    tell application “System Events”
      set aList to bundle identifier of every process
      
if aProcBundleID is in aList then
        
        
set tmpList to name of every process whose bundle identifier = aProcBundleID
        
set aProcName to contents of first item of tmpList
        
        
set aRes to true
        
tell process aProcName
          set processID to unix id –プロセスIDを取得
        end tell
        
        
set processID to processID as string
        
        
–指定プロセスがゾンビプロセス化しているかどうかを判定
        
set procState to (words of (do shell script “/bin/ps “ & processID & ” | cut -d ‘ ‘ -f 6″)) as string
        
        
if procState contains “Z” then
          –ゾンビプロセスを殺す
          
do shell script “/bin/kill -9 “ & processID
          
return “killed”
        end if
      else
        –指定したBundle IDのプロセスが存在しない場合falseでリターン
        
return false
      end if
    end tell
  on error
    –異常発生時にはさっさとリターン
    
return false
  end try
  
  
  
–Phase 2 指定アプリに直接コンタクトして反応を見る
  
try
    with timeout of 3 seconds
      tell application id aProcBundleID
        set aTmpvar to name –これができない(Scriptableな)アプリはほとんどないだろう(多分)
      end tell
    end timeout
  on error
    –名称を取得できなかった場合にはコケていると見なしてプロセスを殺す
    
do shell script “/bin/kill -9 “ & processID
    
return “killed”
    
  end try
  
  
  
return aRes
end detectAppAliveByID_

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

スクリプト名:指定プロセスの死活判定(アプリ名で判定) v2
set psRes to detectAppAliveByName_(“Safari”)
–> true (起動中、ゾンビ化していない)
–> false(起動していない)
–> “killed”(ゾンビ化していたので、killした)

–指定プロセスの死活判定(アプリ名で判定)
on detectAppAliveByName_(aProcName)
  set aProcName to aProcName as string
  
  
–Phase 1 psコマンド経由で状態を確認してみる
  
set aRes to false
  
try
    tell application “System Events”
      set aList to name of every process
      
if aProcName is in aList then
        set aRes to true
        
tell process aProcName
          set processID to unix id –プロセスIDを取得
        end tell
        
        
set processID to processID as string
        
        
–指定プロセスがゾンビプロセス化しているかどうかを判定
        
set procState to (words of (do shell script “/bin/ps “ & processID & ” | cut -d ‘ ‘ -f 6″)) as string
        
        
if procState contains “Z” then
          –ゾンビプロセスを殺す
          
do shell script “/bin/kill -9 “ & processID
          
return “killed”
        end if
      else
        –指定した名称のプロセスが存在しない場合falseでリターン
        
return false
      end if
    end tell
  on error
    –異常発生時にはさっさとリターン
    
return false
  end try
  
  
  
–Phase 2 指定アプリに直接コンタクトして反応を見る
  
try
    with timeout of 3 seconds
      tell application aProcName
        set aTmpvar to name –これができない(Scriptableな)アプリはほとんどないだろう(多分)
      end tell
    end timeout
  on error
    –名称を取得できなかった場合にはコケていると見なしてプロセスを殺す
    
do shell script “/bin/kill -9 “ & processID
    
return “killed”
    
  end try
  
  
return aRes
end detectAppAliveByName_

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2013/01/12 最前面のアプリケーションをいったん終了させてから起動

最前面のアプリケーションをいったん終了させて、ふたたび起動させるAppleScriptです。

これは、コケかけているような怪しい状態のアプリケーションを対象としているものではなく、明確に動いているものを操作するためのものです。

画面の解像度を(狭い方に)変更したときに、フローティングパレットやフローティングウィンドウが隠れてしまうことがあります。その現象を解決するためにいったん終了させてふたたび起動するものです。とくに、アクティビティモニタのCPUの負荷メーターが見えなくなってしまう問題に対処するために作りました。

Script Menuに入れて呼び出して使っています。

スクリプト名:最前面のアプリケーションをいったん終了させてから起動
tell application “System Events”
  set aProc to every process whose frontmost is true
  
set aaProc to contents of first item of aProc
  
  
set aProp to properties of aaProc
  
  
set aBundleID to bundle identifier of aProp
  
end tell

tell application id aBundleID to quit

delay 1

tell application id aBundleID to launch

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2013/01/12 指定プロセスの死活判定

指定プロセス(アプリケーション)がハングアップしているかどうかをUNIX的な見地から判定するAppleScriptです。

アプリ名称で指定して調べるものと、バンドルIDで指定して調べるものを用意してみました。

System Eventsで指定プロセス(アプリケーション)のプロパティを調べると、unix id(process id)を取得できます。このunix idで指定したプロセスの状態をpsコマンドで取得し、ゾンビプロセスになっているかどうかを判定します。

ただ……psコマンドで調べてゾンビプロセスに「なっていない」ものでも、GUI側から操作を試みても7色のビーチボールが回りっぱなしだったり、AppleScriptからの命令を受け付けないといった状態になっていることもままあります。

プロセス(アプリケーション)の死活判定はなかなか奥深いものがあります。実際には、psコマンドで調べるだけでなく、テストデータをオープンさせてみるとか、アプリケーションの名称を取得してみるとか、実行しても意味はないものの結果が得られるかどうかを調べてみるとよいでしょう。

スクリプト名:指定プロセスの死活判定(アプリ名で判定)
set psRes to detectAppAliveByName_(“Safari”)
–> true (起動中、ゾンビ化していない)
–> false(起動していない)
–> “killed”(ゾンビ化していたので、killした)

–指定プロセスの死活判定(アプリ名で判定)
on detectAppAliveByName_(aProcName)
  set aProcName to aProcName as string
  
  
set aRes to false
  
try
    tell application “System Events”
      set aList to name of every process
      
if aProcName is in aList then
        set aRes to true
        
tell process aProcName
          set processID to unix id –プロセスIDを取得
        end tell
        
        
set processID to processID as string
        
        
–指定プロセスがゾンビプロセス化しているかどうかを判定
        
set procState to (words of (do shell script “/bin/ps “ & processID & ” | cut -d ‘ ‘ -f 6″)) as string
        
        
if procState contains “Z” then
          –ゾンビプロセスを殺す
          
do shell script “/bin/kill -9 “ & processID
          
set aRes to “killed”
        end if
      else
        set aRes to false
      end if
    end tell
  on error
    set aRes to false
  end try
  
  
return aRes
end detectAppAliveByName_

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

スクリプト名:指定プロセスの死活判定(Bundle IDで判定)
set aRes to detectAppAliveByID_(“com.apple.safari”)
–> true (起動中、ゾンビ化していない)
–> false(起動していない)
–> “killed”(ゾンビ化していたので、killした)

–指定プロセスの死活判定(Bundle IDで判定)
on detectAppAliveByID_(aProcBundleID)
  set aProcBundleID to aProcBundleID as string
  
  
set aRes to false
  
try
    tell application “System Events”
      set aList to bundle identifier of every process
      
if aProcBundleID is in aList then
        
        
set tmpList to name of every process whose bundle identifier = aProcBundleID
        
set aProcName to contents of first item of tmpList
        
        
set aRes to true
        
tell process aProcName
          set processID to unix id –プロセスIDを取得
        end tell
        
        
set processID to processID as string
        
        
–指定プロセスがゾンビプロセス化しているかどうかを判定
        
set procState to (words of (do shell script “/bin/ps “ & processID & ” | cut -d ‘ ‘ -f 6″)) as string
        
        
if procState contains “Z” then
          –ゾンビプロセスを殺す
          
do shell script “/bin/kill -9 “ & processID
          
set aRes to “killed”
        end if
      else
        set aRes to false
      end if
    end tell
  on error
    set aRes to false
  end try
  
  
return aRes
end detectAppAliveByID_

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2013/01/12 Bundle IDで指定したアプリの非同期起動

AppleScriptでは「ignoring application responses」節によってアプリケーションに対して非同期の命令実行を行えるようになっています。

非同期実行のサンプルとして、バンドルID(com.apple.icalなど)の指定により、該当のアプリケーションを非同期で起動するものを作ってみました。

アプリケーションに対してコマンドを非同期で投げると、結果を待たなくてよいので処理の高速化が図れる場合もありますが、処理結果は取得できないですしエラーが発生した場合にも対処できません。非同期実行は、動作が確実に行える内容で返り値を必要としない場合にのみ利用するべきです(そういうケースはあまりないので、活用するチャンスもそれほどないのですが)。

スクリプト名:Bundle IDで指定したアプリの非同期起動
set aRes to launchAsyncByID_("com.apple.ical") –iCal

–Bundle IDで指定したアプリの非同期起動
on launchAsyncByID_(aBundleID)
  set aBundleID to aBundleID as string
  
  
try
    ignoring application responses
      tell application id aBundleID
        launch
      end tell
    end ignoring
  on error
    –Bundle IDで指定したアプリが存在しない場合にはfalseを返す
    
return false
  end try
  
  
return true
  
end launchAsyncByID_

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2010/09/20 アプリケーションの状態を調べる

AppleScriptからアプリケーションの状態を調べたい、というニーズは多いようで……検索エンジンのキーワードで割と頻繁に調べられているようです。

個別のノウハウについては本Blog上で紹介していますが、体系的にノウハウを整理したことはないので、ここでまとめて紹介しておきます。

(1)アプリケーションがインストールされているかを調べる

アプリケーションの状態を調べるといっても、それがインストールされていなければ調べようがありません。最初にやるべきなのは、AppleScriptを実行するマシンにコントロール対象のアプリケーションがインストールされているかどうかを確認することです。

アプリケーションの存在確認は、Info.plistに書かれているCFBundleIdentifierを確認する必要があります。

appinfo1.jpg

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

appinfo2.jpg

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

appinfo4.jpg

appinfo3.jpg

この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でアプリケーションプロセスの「状態」を調べるノウハウというのは、こんな感じです。

2010/06/10 指定のアプリケーションの起動を待つ

IDで指定した複数のアプリケーションの起動を行い、起動が行われたかどうかチェックを行うAppleScriptです。

とりあえずループで300秒待っていますが、もっと短い時間で済むはずです。

スクリプト名:指定のアプリケーションの起動を待つ
set appIDlist to {“com.apple.Automator”, “com.apple.mail”, “com.adobe.Photoshop”, “com.adobe.distiller”}

set aRes to checkAppInstallation(appIDlist) of me
if aRes = false then return –指定IDのアプリケーションが実行環境にインストールされていない場合はリターン

–起動実行
repeat with i in appIDlist
  tell application id i to launch
end repeat

–起動チェック
repeat 300 times
  if waitAppsActive(appIDlist) of me = true then
    exit repeat
  end if
  
delay 1
end repeat

–指定IDのプロセスが起動しているか確認
on waitAppsActive(appIDlist)
  tell application “System Events”
    set appList to bundle identifier of every process whose visible is true
  end tell
  
  
repeat with i in appIDlist
    if i is not in appList then return false
  end repeat
  
  
return true
end waitAppsActive

–指定IDのアプリケーションがHDD上に存在するかを確認
on checkAppInstallation(appIDlist)
  repeat with i in appIDlist
    tell application “Finder”
      try
        set aRes to exists of application file id i
      on error
        return false
      end try
    end tell
  end repeat
  
  
return true
end checkAppInstallation

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/06/16 FireFoxでオープンしているURLを取得。Leopard対応版

FireFoxでオープンしているURLを取得するAppleScriptの、Leopard以降で実装された機能を活用して記述したものです。

Mac OS X 10.4などでは、System Eventsにプロセス一覧を尋ねて、その中にFireFoxが入っていないかどうかを確認することになりますが、Mac OS X 10.5ではrunningというプロパティを取得できるようになったので、これを参照するのがスマートでよいでしょう。

もともとは、shellからAppleScriptを呼び出して、FireFoxの状態を取得したいという相談(?)を持ちかけられたもので……osascriptコマンドでこのAppleScriptを呼び出すといった感じになるかと>masuiさん

スクリプト名:FireFoxでオープンしているURLを取得。Leopard対応版
tell application "Firefox"
  if running then Mac OS X 10.5 or later
    set aURL to «class curl» of window 1
  else
    set aURL to ""
  end if
end tell
return aURL

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/04/03 指定名称のプログラムを強制終了させる

指定名称のプログラムを強制終了させるAppleScriptです。指定文字列を含むプロセスを取得して、killコマンドで強制終了させます。

スクリプト名:指定名称のプログラムを強制終了させる
kill_aProc("InDesign CS3") of me

指定名称のプログラムを強制終了させる
on kill_aProc(aProcName)
  tell application "System Events"
    set procList to every process whose name contains aProcName
    
if procList is not equal to {} then
      set aProc to contents of first item of procList
      
tell aProc
        set anID to unix id
      end tell
      
do shell script "kill -9 " & (anID as string)
    end if
  end tell
end kill_aProc

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2008/05/31 クリエーターコードを指定してアプリケーションを起動する

普通、クリエーターコードを指定して該当するアプリケーションのパスを取得して、そのパスをFinderでオープンすれば、該当するクリエーターコードのアプリケーションを起動することは可能です。Mac OS X 10.5であれば、そのあたりの機能が追加されているものですが……10.4.xではその機能を利用することはできません。

クリエーターコードで指定すれば該当するアプリケーションのパスが得られる……というのが通常のアプリケーションの動作ですが、Adobe Acrobat Professionalだけは、クリエーターコードからパスを取得すると、アプリケーションバンドル内のヘルパーアプリケーションのパスが返ってきてしまいます。

そこで、対策するコードを作ってみた次第です。こんな処理は、Acrobat以外には必要ないのですが……Adobeのアプリケーションには、ほとほと苦労させられどおしです。
(more…)

2008/05/30 指定クリエーターコードを持つアプリケーションプロセスの個数を数える

異なるバージョンのアプリケーションが同時に複数起動している場合、AppleScriptからコントロールするのは大変です。InDesignのCS2とCS3が同時に起動しているケースとかいったものは、ユーザー環境では日常茶飯事です。そこで、Script実行時に複数のバージョンが同時に起動していたら、警告を発したり処理そのものを中止するといった対策が必要になります。そのため、同一のクリエーターコードで指定したアプリケーションのプロセスが複数起動していないかを検出するサブルーチンを作成した次第です。

スクリプト名:指定クリエーターコードを持つアプリケーションプロセスの個数を数える
countProcWithCreatorCode("CARO") of meAcrobat Professional
countProcWithCreatorCode("8BIM") of me –Acrobat Professional

指定クリエーターコードを持つアプリケーションプロセス(起動中)の個数を数える
on countProcWithCreatorCode(aCode)
  try
    tell application "System Events"
      set pList to every process whose creator type = aCode
      
return length of pList
    end tell
  on error
    return 0
  end try
end countProcWithCreatorCode

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2008/05/02 指定の名称およびバージョンに該当するアプリケーションプロセスが起動しているかどうかをチェック

指定の名称およびバージョンのアプリケーションが起動しているかどうかをチェックするサブルーチンです。

スクリプト名:指定の名称およびバージョンに該当するアプリケーションプロセスが起動しているかどうかをチェック
set apName to "Microsoft Excel"
set apRes to getExistenceOfRunnningProcess(apName, "12.") of me
Excel 2008が起動していればtrue、起動していなければfalseが返る

指定の名称およびバージョンに該当するアプリケーションプロセスが起動しているかどうかをチェック
on getExistenceOfRunnningProcess(apName, apVer)
  tell application "System Events"
    set exF to exists of application process apName
    
if exF = true then
      tell application process apName
        set apProp to properties
        
set apFile to file of apProp
      end tell
    else
      return false
    end if
  end tell
  
tell application "Finder"
    set aVer to version of apFile
  end tell
  
if aVer begins with apVer then
    return true
  else
    return false
  end if
end getExistenceOfRunnningProcess

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2008/04/07 Front Rowが実行中かどうかを調べる

Front Rowが実行中かどうかを調べます。Front Row実行中のみ動作するようなScriptを作成する際に使えることでしょう………………いつ役立つのかさっぱり分りませんが、そういうScriptを作りためておくとイザという時に役立つものです。

スクリプト名:Front Rowが実行中かどうかを調べる
tell applicationFront Row
  set a to isVisible
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2008/04/06 警告を出しつつ再起動

再起動を行う方法としては、System Eventsに対して「restart」コマンドを実行させるのが常套手段ですが、すぐにアプリケーションを終了させて再起動してしまいます。本Scriptでは、普通にメニューから再起動コマンドを実行したのと同様に、再起動ダイアログで警告を表示させつつユーザーに再起動してよいかどうかの許可を求めます。

スクリプト名:警告を出しつつ再起動
tell applicationloginwindowto «event aevtrrst»

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2008/04/05 指定プロセスの可視_不可視切り替え

指定アプリケーションを操作する途中で、どうしても処理内容をユーザーに見せたくないケースがあります。そうした時に本ルーチンを用いて非表示状態にします。表示状態に戻すときにはaBooleanをtrueにして本ルーチンを呼び出してください。

スクリプト名:指定プロセスの可視_不可視切り替え

set aRes to setVisibleOfSpecifiedProcess("Finder", false) of mefalseで不可視に

指定プロセスの可視/不可視切り替え
on setVisibleOfSpecifiedProcess(aProc, aBoolean)
  tell application "System Events"
    if exists process aProc then
      set visible of process aProc to aBoolean
      
set resF to true
    else
      set resF to false
    end if
  end tell
  
return resF
end setVisibleOfSpecifiedProcess

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2008/03/09 指定クリエータのアプリケーションの情報を返す

スクリプト名:指定クリエータのアプリケーションの情報を返す

Illustrator CS/CS2のどちらかがHDD上にインストールされていることを確認
set aList to retVerFromCreator(”com.adobe.illustrator“) of me
aList

> {Name:”Adobe Illustrator.app”, creation date:date “2007年 10月 5日 金曜日 0:00:10 PM”, modification date:date “2008年 3月 1日 土曜日 9:17:52 AM”, input path:{0, 0}, size:3.06324335E+8, folder:true, alias:false, package folder:true, visible:true, extension hidden:true, name extension:”app”, displayed name:”Adobe Illustrator CS3″, short name:”Illustrator”, default application:alias “Mikan:Applications:Adobe Illustrator CS3:Adobe Illustrator.app:”, kind:”アプリケーション”, short version:”13.0.3″, long version:”13.0.3, Copyright © 1987-2007 Adobe Systems Inc. All rights reserved.”, bundle identifier:”com.adobe.illustrator”, file type:”APPL”, file creator:”ART5″, type identifier:”com.apple.application-bundle”, busy status:false}

指定クリエータのアプリケーションの情報を返す
on retVerFromCreator(createrCode)
  if createrCode = “” then
    –Creator Codeに何も指定されていなかったらエラー
    
return falseエラーでもリストで返す
  end if
  
  
tell applicationFinder
    try
      set appFile to (application file id createrCode)
      
set appFile to appFile as alias
      
      
set aFinfo to info for appFile
      
      –
念のため、short verとlong verを返す
      
set vInfo to {short version of aFinfo, long version of aFinfo}
      
return vInfoリストで返す
    on error
      return false
    end try
  end tell
  
return false
end retVerFromCreator

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2008/03/09 プロセス名一覧を取得

スクリプト名:プロセス名一覧を取得
tell application "System Events"
  set a to name of every process whose visible is true
  
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2008/03/09 起動中のアプリのうちScriptableなものをリストにして選択

これは、スクリプトエディタのコンテクストメニューから呼び出す、AppleScript自動記述用スクリプト「コンテクストメニュー」アシスタントのために作ったサブルーチンです。起動中のアプリケーションのうちスクリプタブルなものを選ぶ、という操作は一般のAppleScriptでは必要のない種類のものですが、AppleScriptの自動記述用には必要となってくるものです。

スクリプト名:起動中のアプリのうちScriptableなものをリストにして選択.scpt
getScriptableAppName() of me

on getScriptableAppName()
  tell applicationSystem Events
    set a to name of every process whose (accepts high level events is true) and (has scripting terminology is true) and (visible is true)
  end tell
  
set b to choose from list a with prompttellするアプリケーションを選択してください
  
if b is false then
    returnApplicationName
  else
    set b to item 1 of b
    
return b
  end if
end getScriptableAppName

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2008/03/09 指定アプリの存在確認

AppleScriptでは、割と登場頻度の高い処理です。何かのアプリケーションに依頼して処理を行ってもらうという「他力本願」がAppleScriptの醍醐味。でも、アテにしていたアプリケーションが存在しない環境で実行されてしまったら困ります。そういう事態を防ぐためにも、あらかじめ指定したアプリケーションがAppleScript実行中のマシン上に存在するかどうかを確認しておく必要があります。1人で使うだけのScriptであれば、そんな調査を行っておく必要はありませんが、広域にバラ撒くとか、客先に納品するとかいった場合には、必須の処理といえるでしょう。

スクリプト名:指定アプリの存在確認
tell application “Finder”
  set the iPhoto_check to exists (application file id “com.apple.iphoto”)
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に