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。
首先,我承认我开始使用 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。