年に一度のお祭りなのに小ネタ記事で恐縮ですが、Macをシャットダウンした時に所定のフォルダ内のファイルを削除したいという件があり、やってみました。
AppleScriptって存在は知っていたもののしみじみ使ったのは初めてのような気がします。
やりたいこと
- シャットダウン時に本当に削除してよいかの確認ダイアログを出す
- 「はい」を選ぶと容赦なくフォルダ内のファイルを削除(ゴミ箱にも残さなくてよい)
ステップ1(Automator版)
シャットダウン時というのがややこしそうだったので、まずは手動で動かす方法をやってみました。
Automatorでサクッとできました。
- Automatorで新規→アプリケーションを選ぶ
- ワークフローで「確認を求める」を選ぶ
- ワークフローで「シェルスクリプトを実行」を選ぶ
- 保存した、.appファイルを実行すると動作します
なんとなく流れはつかめましたが、今回やりたいこととはちょっと違うのでこれはこれでおいといて、ステップ2に進みます。
##ステップ2(AppleScript版)
この記事をみて、AppleScriptを使うとアプリケーションが終了する時のイベントをフックすることができることがわかったので、それを応用してみました。
AppleScriptはろくに書いたことがなかったので、見よう見まねで書いてみました。
AppleScriptからアプリケーションを作る
スクリプトエディタを起動して、保存しようとすると、ファイルのフォーマットを以下から選ぶことができます。
- スクリプト
- スクリプトバンドル
- ★アプリケーション
- テキスト
その他の選択肢の使いみちはよくわかっていませんが、今回はアプリケーションを選び、実際のコードを書いていきます。
アプリケーション終了時にダイアログを出す
アプリケーション終了時に発火するon quit
というイベントがあるのでそれを利用します。
with icon xxx
でダイアログにアイコンを表示させることができます。
今回は削除するよ!!というダイアログなので、cautionにしました。
--アプリケーション終了時に呼ばれる
on quit
display dialog "メッセージ内容" buttons {"はい", "キャンセル"} default button "キャンセル" with icon caution
end quit
OKした場合とキャンセルした場合の分岐
if button returned of result is "はい" then
--はいを選んだ時
else if button returned of result is "キャンセル" then
--キャンセルを選んだ時
end if
OKしたときはコマンド叩く
do shell script "/bin/rm -rf ~/download_dummy1/*; /bin/rm -rf ~/download_dummy2/*"
continue quit
キャンセルを押した時に、シャットダウンされてしまうとファイルが削除されないことになるため、今回はキャンセルを押したらシャットダウンされて欲しくありません。
そこでキャンセルしたときは、なにもしないようにしました。
なにもしないということはこのアプリも終了しないため、永遠にシャットダウンされません。
削除してもいい状態にしてリトライしてもらい、かならず削除してもらうというフローにしたかったため
このようにしています。
else if button returned of result is "キャンセル" then
--ここの分岐ではなにもしない
end if
完成形
on quit
display dialog "ダイアログに表示するメッセージ" buttons {"はい", "キャンセル"} default button "キャンセル" with icon caution
if button returned of result is "はい" then
do shell script "/bin/rm -rf ~/download_dummy1/*; /bin/rm -rf ~/download_dummy2/*"
continue quit
else if button returned of result is "キャンセル" then
--なにもしない(シャットダウンもキャンセルされる)
end if
end quit
##参考にさせていただいた記事
https://dev.classmethod.jp/client-side/applescript-logout-sound-off/
http://acknowledge.sblo.jp/article/44449396.html
http://mirror.informatimago.com/next/developer.apple.com/ja/technotes/tn2065.html
http://piro.hatenablog.com/entry/2016/11/19/180405
https://mac-tegaki.com/trouble-shooting/applescript-app-ask-permission-every-time.html
FORK Advent Calendar 2019
3日目 Teleportでのクラスタ管理(GCP編) @shuhei4009
5日目は @nogutea さんよろしくお願いします