タグ: applescript

AppleScriptでプログレスバー – 2

AppleScriptでプログレスバーを表示することについては、ドタバタした内容ながら、ここで紹介しました。
で、デモバージョンとして、”sudo purge”を実行するだけのアプリケーションを書きました。
そう、なんで今更”sudo purge”なんだと思うのですが、適当に処理時間がかかって、プログレスバーを表示するには都合が良かっただけです。

「メモリ開放」に関しては 、Mavericks以降は不要だと言われながらそれなりの数のツールが出ていますが、結局”sudo purge”以上の効果のあるツールを私は知りません。
Appleの、最近のメモリに関する“富豪主義(?)”については、何を言っても無駄な気がしますし、その傾向は留まらないのでしょう。あればありったけ使うので、余裕があればその分だけ積めということのようですから…。

さて、スクリプトは以下のようになります。

property UserName : ""
property UserPasswd : ""
property y : ""
property DialogPath : "/Applications/Dialog.app"

on run
	set y to path to me
	my checkPass_Name()
	my do_do()
	delay 1
	my done_done()
end run

on checkPass_Name()
	tell application "Finder"
		set UserPasswd to comment of (y as alias)
	end tell
	tell application "System Events" to set UserName to name of current user
	if UserName is "" then
		activate
		display dialog "ログインユーザ名を入力してください。" buttons {"キャンセル", "設定"} default answer "" default button 2 with icon caution returning {text returned:theVart, button returned:theVarb}
		if theVart is not "" then
			set UserName to theVart
		else
			return
		end if
	end if
	if UserPasswd is "" then
		activate
		display dialog "ログインパスワードを入力してください。" buttons {"キャンセル", "設定"} default answer "" default button 2 with icon caution with hidden answer returning {text returned:theVart, button returned:theVarb}
		if theVart is not "" then
			set UserPasswd to theVart
			tell application "Finder" to set comment of (y as alias) to UserPasswd
		else
			return
		end if
	end if
end checkPass_Name

on do_do()
	activate
	display dialog "キャッシュファイルの解放を行います。" buttons {"Cancel", "Do Purge!"} default button 2 with icon 1 giving up after 3
	try
		do shell script "open " & quoted form of DialogPath
		delay 1
		do shell script "sudo /usr/sbin/purge" user name UserName password UserPasswd with administrator privileges
	end try
end do_do

to done_done()
	beep 3
	display notification "ディスクキャッシュを解放しました。" with title "完了"
	delay 0.1
	do shell script "killall applet"
end done_done

ダイアログでプログレスバーを表示するアプリケーションはここで紹介した‘Dialog.app’を「アプリケーションフォルダ」へ入れて使う場合のスクリプトです。
‘Dialog.app’の名称を‘ProgressBar.app’とでもしておけばよかったと後で思ったのですが、まあいいでしょう。

デモアプリケーション

上記のアップルスクリプトとほぼ同じ内容のアプリケーションを”デモ版”として用意しました。ダイアログでプログレスバーを表示するアプリケーション‘Dialog.app’は別途に用意しなくても動作するようにバインドしています(編集可能な形式で保存していますので、パッケージの中身を見ていただければバインドのやり方がわかるでしょう)。

下記アドレスからダウンロード可能としました。
http://amstudio.sytes.net/amweb/purge_mem_prgrs.iso.zip

※アプリケーションの著作権は放棄いたしませんが、対価は不要です。自己責任で、自由にお使いください。
インターネット上のリンクは、作者への事前/事後の承諾は不要ですので、自由にリンクして下さい。
基本的に、再配布・転載は認めません。

保証

動作に関する保証はいたしません。また、使用によって生じたと思われるいかなる損害に対しても、作者は一切責任を負いません。使用は御自身の責任において行なってください。

広告

Gooey Gadgets.appなき今 – AppleScriptでプログレスバーもどきを作ってみる

macOS Sierraとなってから(だった思います)‘Gooey Gadgets.app’が起動できなくなってしまったので、AppleScriptからプログレスバーを簡単に表示できる手段を失ってしまった格好です。

‘Gooey Gadgets.app’を使っていた際の手順は以下のような行程でした。

  • Script内でメインの処理プロセスをコールする直前に外部プロセスとしてプログレスバーを呼び出す
  • Script内の処理が終わった段階でプログレスバー表示を終了させる
  • 後処理としてScriptの終了処理をする

調べてみると‘cocoaDialog.app’というアプリケーションがあるようです(ザリガニが見ていた…さんのページを参考にしました)。
が、使ってみると、スクリプト内から‘do shell script…’で“ –indeterminate”モードでコールすると、Script内のプロセスとして‘cocoaDialog’が組み込まれてしまうので、Scriptの次のステップに移れなくなってしまい、私の技量レベルでは使えそうにありません。
(別プロセスとして‘cocoaDialog.app’を起動するためのアプリケーションを用意するという手がありそうですが、あまり気乗りのする手段ではなさそうです。)

こうなれば自作してみる – AppleScript

私が欲しいものは、進捗状況を反映したものではなく、単に“処理中です…”などのテキストを表示してくれればいいだけのものです。まさに‘Gooey Gadgets.app’のようなシンプルなアプリケーションであればいいのです。
プログレスバーに進捗状況を反映させるだけの技量はないので、プログレスバーもどきとしてScriptの処理中に画面に“処理中…”などと表示させればいいので、AppleScriptの‘progress’を使ってアプリケーションを仕立ててみることにしました。
Script自体はいたって簡単です。

set progress total steps to 100 -- ここから
repeat with i from 1 to 100
	set progress completed steps to i
	delay 0.2
end repeat -- ここまでは、まさにダミーで、なんら進捗状況を反映しているわけではありません。
set progress description to "処理中です。
しばらくお待ちください..."
with timeout of 7200 seconds -- まあ2時間もあればいいかと...
	set progress total steps to -1
	delay 7200
end timeout

必ず、アプリケーション形式で保存します。今回は、そのまま‘Dialog.app’という名前で、アプリケーションフォルダ内へ保存しました。
固定表示の時間設定は、使い勝手に合わせて適当に書き換えればいいでしょうが、中途半端に短いとScriptの処理の途中で画面表示が終わってしまいます。

Script内で呼び出す時は、

‘do shell script “/Applications/Dialog.app/Contents/MacOS/applet”’

あるいは

‘do shell script “open /Applications/Dialog.app”’

で呼び出せばいいでしょう(アプリケーションフォルダ内を前提にしています)。(直接実行ファイルを叩くと、外部アプリケーションとして扱えないようで、appletの処理待ちになってしまいますので、‘do shell script “open /Applications/Dialog.app”’という起動の仕方を使ってください — 2017.06.23)
‘Dialog.app’を終了させてダイアログを消す時は、‘do shell script “killall applet”’を使った方が間違いがないようです。‘tell application “Dialog” to quit’でやると、何度か空振りしてしまいました。
‘do shell script “killall applet”’を使う時には、同時に複数のAppleScriptアプリケーションが起動していないように注意してください。

と、ここまで書いた後に、実行ファイル、”/Applications/Dialog.app/Contents/MacOS/applet”の名称を‘applet’から‘Dialog’にリネームしてみました。動きました。
となると、
Script内で呼び出す時は、

‘do shell script “/Applications/Dialog.app/Contents/MacOS/Dialog”’

でOKで、終了は、

‘do shell script “killall Dialog”’

でいけることになります。

補足と修正 – 17.06.21

実行ファイル、”/Applications/Dialog.app/Contents/MacOS/applet”の名称を‘applet’から‘Dialog’にリネーム後に、‘Info.plist’の中も書き換えていたことを書き忘れていたのですが、その後、再現してみると‘Info.plist’を書き換えると、アプリケーションの起動時に初期画面が出てしまうことがわかりました。現時点で、リネームしてそのまま起動させる方法が分からなくなってしまったのでリネームなしで使った方がいいようです。m(._.)m

ダウンロード

アプリケーションを下記アドレスからダウンロード可能としました。
http://amstudio.sytes.net/amweb/Dialog.iso.zip

(このアプリケーションは、”Dialog.app/Contents/MacOS/applet”の名前を変更していません。環境に合わせて、必要であればリネームしてください)

※アプリケーションの著作権は放棄いたしませんが、対価は不要です。自己責任で、自由にお使いください。
インターネット上のリンクは、作者への事前/事後の承諾は不要ですので、自由にリンクして下さい。
基本的に、再配布・転載は認めません。

保証

動作に関する保証はいたしません。また、使用によって生じたと思われるいかなる損害に対しても、作者は一切責任を負いません。使用は御自身の責任において行なってください。