Macのゴミ箱アプリ完成形

AppleScriptのゴミ箱アプリを作って機嫌良く使っていたのですが、たまにエラーが出るので改善し、完成形として仕上げました。

AppleScript で作るゴミ箱アプリ

ゴミ箱アプリをApplescriptで作った投稿があります。

AppleScriptでゴミ箱モドキを作った

次の機能を備えたApplescriptを書いてアプリとして保存、デスクトップにゴミ箱として置くという話でした。

  • ドラッグしたアイテムがボリュームの場合はイジェクト
  • ファイルやフォルダの場合はゴミ箱にポイ
  • ダブルクリックすればFinderでゴミ箱を開く

概ね良い感じに使えていたのですが、ファイル共有でマウントしたボリュームやフォルダをイジェクトする時にエラーが出ていました。自分の力量を超えた部分なので改良の目処も立たず放置していましたが、AI に相談することで解決出来るかもしれないと、これまで何度も Chahttps://www.digitalboo.net/post/16146/eject-or-trashtGPT や Gemini に相談を持ちかけていました。

AI でも歯が立たず

しかし何度しつこくやりとりしてもスクリプトを修正することが出来なかったんですね。原因追及とそれに対処したスクリプトを幾度となく提案され、その都度「なるほど」と試すもののすべて撃沈。

エラーの原因やその対処についてのやりとりは有意義なものでしたが、最終的にまともに動かない出来損ないスクリプトしか出てこなくて、それなら最初に作ったやつのほうがましだと、共有のイジェクトエラーに我慢して以前のスクリプトを使っていました。

macOS の過剰なセキュリティによる限界

実はAI の提案は理屈では正しかったのですが、結局のところ macOS のセキュリティの問題だったようです。スクリプトエディタに書いてアプリとして保存するわけですが、この仕組み自体がちょっと古いせいか、新しいOSのセキュリティをクリアできないのではないか?という推測が AI からなされました。このような推測は AI のバージョンアップのおかげです。

で、じゃあ解決策はということですが、賢いAIが提案したのは Automator を使うことでした。

Automator で作るゴミ箱完成形

スクリプトエディタに書いてアプリとして保存したアプリはエラーで動かないけど、同じスクリプトを Automator に書いてアプリとして保存することで、それは正常に動作しました(スクリプトの内容は Automator に合わせて AI が多少修正しています)

作り方

Automator で「AppleScript を実行」を選ぶだけ。

以下のスクリプトをズバッとコピペします。

スクリプト
-- Automatorアプリケーション用の最終コード (カーソル処理削除)

on run {input, parameters}
	-- 処理中にカーソルを変更するCocoaコードを削除
	-- set busy_cursor to current application's NSCursor's operationNotAllowedCursor()
	-- busy_cursor's push()
	
	try
		-- 項目がドロップされた場合 (inputにファイルパスが含まれる場合)
		if (count of input) > 0 then
			repeat with anItem in input
				-- ドロップされた項目をHFSパス(テキスト)として取得
				set itemPathHFS to anItem as text
				
				-- HFSパスがコロンで終わるか確認 (ボリュームの判定)
				if itemPathHFS ends with ":" then
					-- 項目がボリュームの場合
					my eject_volume_finder(anItem)
				else
					-- ファイルまたはフォルダをゴミ箱に移動
					my move_to_trash_finder(anItem)
				end if
			end repeat
			
			-- アプリケーションがダブルクリックされた場合 (inputが空の場合)
		else
			tell application "Finder"
				activate
				open the trash
			end tell
		end if
		
	on error errMsg number errNum
		display dialog "処理エラー (" & errNum & "): " & errMsg buttons {"OK"} default button "OK" with icon stop
	end try
	
	-- 処理完了後にカーソルを元に戻すCocoaコードを削除
	-- busy_cursor's pop()
	
	return input
end run

-- ファイルまたはフォルダをFinderでゴミ箱に移動するハンドラー
on move_to_trash_finder(the_item)
	try
		tell application "Finder"
			delete the_item
		end tell
	on error errMsg
		if errMsg does not contain "-128" then
			display dialog "ゴミ箱への移動に失敗しました。" & return & "項目: " & (the_item as text) & return & "エラー: " & errMsg buttons {"OK"} with icon caution
		end if
	end try
end move_to_trash_finder

-- ボリュームをFinderでイジェクトするハンドラー
on eject_volume_finder(the_volume)
	try
		tell application "Finder"
			eject the_volume
		end tell
	on error errMsg
		if errMsg does not contain "-128" then
			display dialog "ボリュームのイジェクトに失敗しました。" & return & "ボリューム: " & (the_volume as text) & return & "エラー: " & errMsg buttons {"OK"} with icon stop
		end if
	end try
end eject_volume_finder

度重なるAIとのやりとりの末のスクリプトでありまして、とっくに自分の理解できる範囲を超えています。ですのでこのスクリプトを詳細に解説したりできません🙇

これをアプリとして保存しデスクトップに置いて試用していますが、現在のところ正常に動作しています(このアプリのフルディスクアクセスを許可することは必要)

Download: ゴミ箱.app.zip

デスクトップにゴミ箱がほしい人はお試しを。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください