osascript 比脚本编辑器慢很多

osascript is very slower than Script Editor

首先,我承认我开始使用 JXA 的新项目(Javascript 自动化 mac os),但对 AppleScript 了解不多。

目前,我正在尝试 运行 使用 JXA 执行以下命令:

Application("System Events").processes.windows.name()

首先,我使用脚本编辑器来运行它。它运行良好,我很快就得到了输出。

但是,根据我的用例,由于我想经常从我的 bash 脚本之一获取这段代码的输出,我尝试使用 [=33= 来执行它]ascript如下

osascript -l JavaScript -e 'Application("System Events").processes.windows.name()' 

但这一次,在控制台打印结果需要几秒钟。

现在我的问题是,与脚本编辑器相比,为什么在 osascript 中执行相同的脚本需要花费太多时间?有什么办法可以优化它的性能吗?

这不完全是您问题的答案,但您的 JXA 脚本存在的一个问题是它正在拉入所有进程(数量可能很大),而您可能只需要那些可见的进程应用。那么,让我们从那个开始吧。

这是获取所有可见应用的所有非空 window 名称列表的 AppleScript,在一行的 CSV 列表中:

tell application "System Events"
  set appList to (every application process whose background only is false)
  set winList2 to {}

  repeat with oApp in appList
    set winList to (name of every window in oApp whose name is not "")
    set winList2 to winList2 & (items of winList)
  end repeat

end tell

set AppleScript's text item delimiters to ","
set winListText to winList2 as text
return winListText

-->All Notes,Keyboard Maestro Editor,macos - osascript is very slower than Script Editor - Stack Overflow - Google Chrome - JMichael,Untitled 2.scpt,Untitled 2

转换为 JXA 应该不难,但是如果您只是 运行 它就像在使用 osascript 的 shell 脚本中一样,我认为转换为 JXA 没有任何优势.

我不知道您的工作流程的性质,但如果是我,我会运行将其作为编译的脚本文件 (.scpt),然后使用 bash 执行您的脚本AppleScript do script(或 JXA doScript())命令。

如果您将 .scpt 文件与 osascript 命令一起使用,速度也会更快。

我将继续处理此脚本并将其转换为 JXA,如果不是您的利益,也是为了我自己的利益。

希望您觉得这有用。如果没有,也许其他人会。

有问题吗?

这是 JXA 解决方案:

var winList = Application("System Events").processes.whose({backgroundOnly: {'=': false} }).windows.name();

var winList2 = winList.reduce(
  function(accumulator, currentValue) {
    return accumulator.concat(currentValue);
  },
  []
);
winList2 = winList2.filter(e => (e !== ""));
winList2.join(',')

那些 JavaScript 大师们可能会有更好的 JavaScript。