如何从macOS上的JXA / JavaScript for Automation脚本运行内联Applescript?

时间:2017-10-08 07:32:50

标签: javascript macos applescript osascript jxa

我有一个用JavaScript编写的脚本,需要运行一小段AppleScript(以实现一些我无法实现的功能,因为JS本身有很多因素)。

它应该能够采用单个字符串参数,并且几乎是一个告诉最终的一个班轮。

是否可以在JavaScript中将此纳米程序组装为字符串,然后将字符串传递给AppleScript环境以执行,以及如何完成?

网上有很多关于如何从Applescript运行JavaScript的解释,但不是那么多。

这很可能会涉及到osascript -e的shell调用来实现,还是更清洁,更多的JXA-ey方式?

2 个答案:

答案 0 :(得分:1)

这是ES6(Sierra onwards)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的以下替代定义,我们需要使用'use scripting additions \ 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'
    );
})();

答案 1 :(得分:0)

使用标准添加'run script命令。

(顺便说一下,我的标准建议是坚持使用AppleScript进行应用程序自动化,因为它是唯一可以正常使用的[支持]选项.JXA的各种错误,缺陷和遗漏在发货之前都已知道,而且Apple无法'那时候很难解决它们,所以现在自动化团队已经被淘汰了,它们肯定不会被修复。整个Mac自动化平台无论如何都要死了,但至少AppleScript应该比JXA慢,这从来都不是正确的。 。)