LoginSignup
4

More than 3 years have passed since last update.

posted at

updated at

Organization

AppleScriptでMacのシャットダウン時にファイルを削除する

年に一度のお祭りなのに小ネタ記事で恐縮ですが、Macをシャットダウンした時に所定のフォルダ内のファイルを削除したいという件があり、やってみました。
AppleScriptって存在は知っていたもののしみじみ使ったのは初めてのような気がします。

やりたいこと

  • シャットダウン時に本当に削除してよいかの確認ダイアログを出す
  • 「はい」を選ぶと容赦なくフォルダ内のファイルを削除(ゴミ箱にも残さなくてよい)

ステップ1(Automator版)

シャットダウン時というのがややこしそうだったので、まずは手動で動かす方法をやってみました。
Automatorでサクッとできました。

  • Automatorで新規→アプリケーションを選ぶ
  • ワークフローで「確認を求める」を選ぶ
  • ワークフローで「シェルスクリプトを実行」を選ぶ
  • 保存した、.appファイルを実行すると動作します 貼り付けた画像_2019_08_29_21_55.png

なんとなく流れはつかめましたが、今回やりたいこととはちょっと違うのでこれはこれでおいといて、ステップ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


:christmas_tree: FORK Advent Calendar 2019
:arrow_left: 3日目 Teleportでのクラスタ管理(GCP編) @shuhei4009
:arrow_right: 5日目は @nogutea さんよろしくお願いします

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4