如何在 JavaScript 中执行 AppleScript 的 «event aevtrlgo»?

How can I do AppleScript's «event aevtrlgo» in JavaScript?

在 macOS 上,osascript 命令行工具可用于 运行 AppleScript 和 JavaScript,它们都可以访问 Apple Events API。

对于大多数 API,翻译非常简单。例如

tell application "Terminal" to quit

转换为:

Application("Terminal").quit()

此外,在 JS 中有一个 commandsOfClass 函数可以列出可用的操作:

osascript -l JavaScript -e 'Application("Terminal").commandsOfClass()'
# close, count, delete, doScript, duplicate, exists,
# getURL, make, move, open, print, quit, save

osascript -l JavaScript -e 'Application("System Events").commandsOfClass()'
# abortTransaction, attachActionTo, attachedScripts, beginTransaction, cancel, click,
# close, confirm, connect, count, decrement, delete, disconnect, doFolderAction,
# doScript, duplicate, editActionOf, enable, endTransaction, exists, increment,
# keyCode, keyDown, keyUp, keystroke, logOut, make, move, open, perform, pick,
# print, quit, removeActionFrom, restart, save, select, shutDown, sleep, start, stop

但是 AppleScript 有一些更晦涩的事件,特别是 aevtrlgo ("really log out") 一个:

tell application "loginwindow" to «event aevtrlgo»

我什至无法在终端中输入 «» 个字符,所以这是一个可复制粘贴的版本:

printf 'tell application "loginwindow" to \xc2\xabevent aevtrlgo\xc2\xbb' | osascript

现在,我如何在 JavaScript 中执行此操作 «event aevtrlgo»

我试过类似的东西:

Application("loginwindow").rlgo();
Application("loginwindow").aevtrlgo();
Application("loginwindow").reallyLogOut();
Application("loginwindow").event("rlgo");
Application("loginwindow").event("aevtrlgo");
Application("loginwindow")["«event aevtrlgo»"]();

但我总是得到完全相同的回复:

execution error: Error on line 1: Error: Message not understood. (-1708)

加上 Application("loginwindow").commandsOfClass() 生成一个空列表。

这个解决方法对我有用,但只在脚本编辑器中有效(据我所知):

var app = Application.currentApplication();
app.includeStandardAdditions = true;

app.doShellScript('osascript -e "tell application \"loginwindow\" to «event aevtrlgo»"');

JXA 与之前的 ScriptingBridge 一样,在设计上存在缺陷并且在实现上不成熟,因此许多在 AppleScript 中完美运行的操作并不 right/at 全部运行(而且很少有人清楚为什么)。在这种情况下,JXA 缺少用于处理原始四字符代码的 public API,这意味着如果 JXA/the 目标应用程序不为您 types/events/etc 提供有效的 AE 术语,您就是 SOOL想用

我的标准建议:坚持使用 AppleScript,因为它是 唯一 官方支持的选项,知道如何正确说出 Apple 事件。