AppleScriptを使ってFinderを制御する際の実行速度について

【機種】Mac mini M4 Pro / macOS 15.3 Sequoia

【実行環境】 スクリプトエディタ バージョン2.11 (231), AppleScript 2.8 / アプレット

以下のコードを実行した場合の実行速度について聞きたいことがあります.内容としては「開いているすべてのFinderウインドウを一枚ずつ、順番に最前面にしていく」だけの簡単なものです.やりたいことは他にあるのですが、足がかりとして組みました.基本的にはアプリケーションとして保存し、Finderからクリックして起動します.ただし編集中にスクリプトエディタから「アプリケーションとして実行」または「実行」することもあります.速度的な話でいえば、どれもすべて同じくらいの時間で終了します.具体的には、ひとつのウインドウ(またはタブ)をアクティブ(最前面化)にするのに約1秒かかります.12枚分のウインドウ(またはタブ)を開いている場合、12秒程度で正しく終了します.

tell application "Finder"
	set aListWindow to Finder windows
	repeat with e in aListWindow
		activate e
	end repeat
end tell

正直な感想は「なんでこんなに遅いの?」ということです.とはいえ、ウインドウを最前面にする処理がどういった理屈で動いているのかわかりませんし、もしかすると内包するフォルダに含まれるファイル数なども関係しているのかもしれません.少なくとも自身の知らない事情で「遅いと感じる」可能性も排除できないので滅多なことは言わないようにします.なので、この実行時間が妥当なものなのかを自身で判断することはできません.

このような命令実行なら、今回くらいの実行時間が妥当なものなのか知りたくなり質問しました.実行して、教えていただけると嬉しいです.

Mac mini (M4)

投稿日 2025/02/25 21:06

返信
スレッドに付いたマーク ランキングトップの返信

投稿日 2025/02/25 21:48

当方でも同様に遅いです。ただ、activate はアプリケーションを最前面にするコマンドなのでコードが間違ってるように思います。こんな感じでどうでしょうか?


tell application "Finder"
    set aListWindow to Finder windows
    repeat with e in aListWindow
        set e's index to 1
        delay 0.1
    end repeat
end tell


ご参考

Commands Reference

返信: 9
並べ替え順: 
スレッドに付いたマーク ランキングトップの返信

2025/02/25 21:48 light289 への返信

当方でも同様に遅いです。ただ、activate はアプリケーションを最前面にするコマンドなのでコードが間違ってるように思います。こんな感じでどうでしょうか?


tell application "Finder"
    set aListWindow to Finder windows
    repeat with e in aListWindow
        set e's index to 1
        delay 0.1
    end repeat
end tell


ご参考

Commands Reference

返信

2025/02/28 11:24 light289 への返信

JXA と Scriptging Bridge では問題ありませんでした。

AppleScript の問題としてフィードバックしてはどうでしょうか。


# JavaScript for Automation (JXA)

function run() {
    for (const w of Application('Finder').finderWindows()) {
        w.activate();
        delay(0.1);
    }
}


# Scripting Bridge

#!/usr/local/bin/python3

import ScriptingBridge as SB
import time

finder = SB.SBApplication.applicationWithBundleIdentifier_('com.apple.finder')
for w in finder.FinderWindows():
    w.activate()
    time.sleep(0.1)


環境

Mojave 10.14.6

  • Script Editor 2.11 / AppleScript 2.7
  • Python 3.9.12 (Homebrew) / pyobjc 8.5

Parallels Desktop 18 上の Sequoia 15.3

  • Script Editor 2.11 / AppleScript 2.8
  • Python 3.12.8 (Homebrew) / pyobjc 11.0


# JXA はスクリプトエディタから実行、Python は Terminal から実行


返信

2025/02/26 23:29 Hiro__S への返信

おお! 比べてみると速さが全く違いますね.遅い・早いは感覚的なものなので解釈が異なる場合はありますが、この場合、提示していただいたコードのほうが圧倒的に早いです.


>ただ、activate はアプリケーションを最前面にするコマンドなのでコードが間違ってるように思います。

それなんですけども、以下はスクリプトエディタ・ライブラリ内の用語説明(Finder)からの引用です.

activate v : Activate the specified window (or the Finder)
activate [specifier] : the window to activate (if not specified, activates the Finder)

この情報を元に書いたのが冒頭の質問用のコードです.英語の出来ない私は翻訳に頼るしかないのでそうしていますが、こうあります.

google翻訳
activate v : 指定されたウィンドウ (または Finder) をアクティブにします
activate [指定子] : アクティブにするウィンドウ (指定しない場合は Finder をアクティブにします)

実のところ、これを読むまでactivateが「ウインドウに対するアクション」であることを知りませんでした.この内容を読むかぎり、実のところFinderをアクティブにすることは「おまけ」なんですね.ですが、あまりに遅すぎるのでちょっと使い物にならないですね.提示していただいたコードのように、ウインドウのインデックス番号を直接操作するほうが圧倒的に早いので今後はそうすることにします.

AppleScriptは「書き方によって実行速度がまったく違う」とはよく言いますし、そう聞きますが、提示していただいたコードのdelay命令を外すと結果が目で追えないくらいの速さですから、どこをどう遠回りすればひとつのウインドウをアクティブにするのに1秒程度もかかるのか理解に苦しみます.なんだか公式の地雷みたいで怖いですねぇ.

ともあれ、有用なコードのご提示、ありがとうございました.

返信

2025/02/28 12:10 light289 への返信

個別にウィンドウを最前面に持ってくる処理にどの程度の意味があるのかは分かりませんが、時間がかかっていることは事実のようです。

であれば、各Finder Windowの情報を取得して、ふたたび作成すれば個別のWinodwを最前面に持ってくるのと同様の効果が得られるのではないでしょうか?


tell application "Finder"
	set tList to target of every Finder window
	set cVList to current view of every Finder window
	set aLen to length of tList
	
	close every window
	
	repeat with i from 1 to aLen
		set aWin to make new Finder window
		set target of aWin to contents of item i of tList
		set current view of aWin to contents of item i of cVList
	end repeat
end tell

返信

2025/02/28 20:21 Piyomaru への返信

>各Finder Windowの情報を取得して、ふたたび作成すれば個別のWinodwを最前面に持ってくるのと同様の効果が得られるのではないでしょうか?

これ、タブとして開いているウインドウはすべて展開されてしまうのではないでしょうか.今のわたしの環境は用途ごとに分けたタブとして開いているウインドウがいくつもあり、ちょっと試すのが怖いです.

AppleScriptのFinderの用語説明をいくら読んでもタブに関する情報を見つけることができなかったので、おそらくAppleScriptによる制御ではウインドウをタブとして開くことはできないのではないですか? えっと、GUIスクリプティングを用いる場合は例外ですが、あれ、とても面倒なのとOSのバージョンが上がると組み直す必要が出てくることもあり保守にも気を遣うんですよね..

それと、その懸念しているタブのこととは別に、リストでもカラムでも、個別に並び替え設定をしている場合、それらはどうなってしまうのでしょう.新しく開くことになるとすると、おそらくデフォルトの設定が反映されてしまい、個別に設定していたオリジナルの並び替え設定は反映されない気がするのですが.

情報としてとても有意義で、はっきり言ってとても参考になるのですが(今自身がしようとしていることに合致する部分も多いので)、タイトルの内容からは少し離れてしまうので、ここまでとさせてください.改めて質問する際、よろしくお願いします.

返信

2025/02/28 20:30 Hiro__S への返信

>JXA と Scriptging Bridge では問題ありませんでした。

それらの言語について明るくないのでなんとも言えませんが、それらについては、activateの命令でそれぞれのウインドウを最前面する動作はAppleScriptを使用して実行した場合のように「遅くない」ということで良いでしょうか.そう読み取れますが.

>AppleScript の問題としてフィードバックしてはどうでしょうか。

このあいだ別件でフィードバックを送ったのですが、詳しい状況なども書かないといけないため、AppleScriptについてはなんとかなりますが、それ以外の言語についての比較などは知識がないため現状では少し難しそうです.すいません.


返信

2025/02/28 21:28 light289 への返信

それらについては、activateの命令でそれぞれのウインドウを最前面する動作はAppleScriptを使用して実行した場合のように「遅くない」ということで良いでしょうか.そう読み取れますが.


おっしゃるとおりです。同じことをやってるのに AppleScript だけが遅いです。


このあいだ別件でフィードバックを送ったのですが、詳しい状況なども書かないといけないため、AppleScriptについてはなんとかなりますが、それ以外の言語についての比較などは知識がないため現状では少し難しそうです.


他の言語については触れずに AppleScript の問題のみを詳細に報告すれば良いと思います。


Parallels Desktop 上の Lion から Sierra までで確認したところ、El Capitan 以降遅くなったようです。結構古くから起きていた問題のようですが、今まで誰も気づかなかったのかもしれませんね。

返信

2025/03/01 12:37 Hiro__S への返信

NSAppleScript を使ったコマンドラインツールを Xcode で作成して Terminal から実行してみました。activate を使ったコードは遅く、index をセットする方は速かったです。スクリプトエディタを全く使ってないのに同じ結果なので AppleScript の問題と言えそうです。


環境: Parallels Desktop 上の Sequoia 15.3.1 / Xcode 16.0


返信

AppleScriptを使ってFinderを制御する際の実行速度について

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。