如何从macOS上的JXA/JavaScript for Automation脚本运行内联Applescript?
问题描述:
我有一个用JavaScript编写的脚本,它需要运行一小段AppleScript(为了实现由于JS中原生的许多因素而无法实现的某些功能)。如何从macOS上的JXA/JavaScript for Automation脚本运行内联Applescript?
它应该能够采取单个字符串参数,并且几乎是一个告诉endtell一个班轮。
是否有可能在JavaScript中将此nanoprogramme组装为一个字符串,然后将该字符串传递给AppleScript环境执行,以及如何完成该操作?
网上有很多关于如何从Applescript运行JavaScript的解释,但没有像其他方式那么多。
这是否会 - 很可能 - 涉及一个shell调用osascript -e
来实现更清晰的JXA-ey方式吗?
答
使用Standard Additions'run script
命令。我的标准建议是坚持使用AppleScript来进行应用程序自动化,因为它是唯一可以正常运行的[支持]选项.JXA的各种错误,缺陷和遗漏在它发货之前都是已知的,而且苹果公司也不知道那么现在自动化团队已经被淘汰了,所以他们当然不会被修复,整个Mac自动化平台都会死去,但是至少AppleScript应该比JXA慢一点,而JXA从来就没有正确的开始与。)
答
这是ES6(Sierra向前)macOS的evalAS函数。
(() => {
'use strict';
// evalAS :: String -> IO String
const evalAS = s => {
const
a = Application.currentApplication(),
sa = (a.includeStandardAdditions = true, a);
return sa.doShellScript(
['osascript -l AppleScript <<OSA_END 2>/dev/null']
.concat([s])
.concat('OSA_END')
.join('\n')
);
};
return evalAS('tell application \"Finder\" to the clipboard');
})();
shell方法的优点很简单,脚本添加在评估环境中自动可用。
如果我们使用evalSA下列替代定义,我们需要明确地在前面加上我们的表达字符串“使用脚本添加\ n”
(() => {
'use strict';
// evalAS2 :: String -> IO a
const evalAS2 = s => {
const a = Application.currentApplication();
return (a.includeStandardAdditions = true, a)
.runScript(s);
};
return evalAS2(
'use scripting additions\n\
tell Application "Finder" to the clipboard'
);
})();