0

在 macOS 上,osascript命令行工具可用于运行 AppleScript 和 JavaScript,两者都可以访问 Apple 事件 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(“真正注销”)事件:

tell application "loginwindow" to «event aevtrlgo»

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

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

现在,我怎样才能«event aevtrlgo»在 JavaScript 中做到这一点?

我试过这样的事情:

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)

PlusApplication("loginwindow").commandsOfClass()产生一个空列表。

4

2 回答 2

2

JXA 和之前的 ScriptingBridge 一样,在设计上存在缺陷,在实现上也很不成熟,所以许多在 AppleScript 中完美运行的操作都无法正常工作/根本无法正常工作(而且很少有人清楚为什么)。在这种情况下,JXA 缺少用于处理原始四字符代码的公共 API,这意味着如果 JXA/目标应用程序没有为您想要使用的 AE 类型/事件/等提供有效的术语,那么您就是 SOOL。

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

于 2017-05-28T08:45:45.763 回答
0

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

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

app.doShellScript('osascript -e "tell application \\"loginwindow\\" to «event aevtrlgo»"');
于 2017-05-27T18:18:58.380 回答