[Automator & AppleScript] Automator: アクション・変数を AppleScript で表現する

さわっている内に、AppleScript でスッキリ書きたくなってきたので、いろいろ調べてみました。

こちらが大変参考になりました。

Contents

変数をセットする

set foo to bar で代入する。
値は & で繋げることができる。

set msg to "ピクセルの最大値を指定して下さい。" & return & return & ¬
  "入力した数値(px)になるまで、画像の最も長い辺をアスペクト比を保ったまま縮小します。" & return & ¬
  "それ以下は縮小しません。"

なにげに以下の細かいところが分からなかった。

スクリプト内で改行する

読みやすくしたいが、改行で意味が変わってしまう。
option + return でスクリプト内での改行ができる。

表示テキスト内で改行させる

\n は展開されてしまい、動くけれどもスクリプトが汚いことに。
return とすればよい。

ダイアログを表示する

returned of で入力値を受け取れるよう。

tell application "System Events"
  display dialog msg as text default answer "400" buttons {"OK", "Cancel"}
  set maxpxl to text returned of result
end tell

result で全てを受けることができる。

エラー処理

try でひろう。

try
  tell application "System Events"
    display dialog msg as text default answer "400" buttons {"Cancel", "OK"}
  end tell
  set maxpxl to text returned of result
on error errMsg number errNo
  tell application "System Events"
    display alert errMsg & return & "ERROR: " & errNo as warning
  end tell
  return
end try

キャンセルした場合は、アプリを終了する

cancel もエラー扱い。メッセージとエラー番号がとれる。
return で、処理が終了できる。以降のスクリプトは実行されない。

が、Automator の処理は止まらないので、エラーナンバーなどを利用してアプリを止める必要がある。
tell me to quit

try
  display dialog dialogMsg as text default answer defaultMaxpxl buttons {"Cancel", "OK"}
  set maxpxl to text returned of result
on error errMsg number errno
  if errno is (-128) then
    tell me to quit
  else
    tell application "System Events"
      display alert errMsg & return & "ERROR: " & errno as warning
    end tell
  end if
  return
end try

アプリの起動と終了

tell application "ImageOptim" to activate
delay 5
tell application "ImageOptim"
  quit
end tell

起動した後の動かし方がまだ分からない。

新規フォルダを作成する

tell application "Finder"
  set p to path to desktop
  make new folder at p with properties {name:"ConvertImages"}
end tell

path to desktop でデスクトップのパスを取得。

フォルダの複製

set srcFolder to alias ((path to desktop folder as text) & "TestFolder")
set destFolder to alias ((path to documents folder as text))
tell application "Finder"
  duplicate srcFolder to destFolder
end tell

items of folder (srcFolder) とすると、フォルダ内のアイテムを複製してくれる。

ファイルを削除する

フォルダ内のアイテムを削除する。

delete (every item of folder destFolder)

フォルダの存在確認はこんな形。

if exists destFolder then

アイテム名を取得する

フォルダ内のアイテム名は、このような形で配列(list)に収めてくれる。

set fileNamelist to list folder destFolder without invisibles

without invisibles は、.で始まるファイルを除外してくれる。

アイテムを取得する

名前ではなく、アイテムを扱うために。

as alias list がポイントみたい。

tell application "Finder" to set elements to input as alias list
return elements

配列から取り出して処理する

配列(list) からひとつずつ取り出して処理する。

repeat with this_file in targetItems
  display alert this_file
end repeat

コマンドを実行する

do shell script で、コマンドラインのコマンドを実行できる。

try
  tell application "Finder"
    set targetItems to items of folder (destFolder) as alias list
    set targetItems to get POSIX path of (targetItems)
    set myScript to "open "
  end tell
  tell application "Terminal"
    do shell script myScript & quoted form of targetItems
  end tell
on error errMsg number errno
  tell application "System Events"
    display alert errMsg & return & "ERROR: " & errno as warning
  end tell
  return
end try

do script と違い、アクティブにならずにこっそり動いてくれるよう。

シェルを指定して do shell script する。

補遺