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

如何在macOS上从JXA/JavaScript for Automation脚本运行内联Applescript?,javascript,macos,applescript,osascript,javascript-automation,Javascript,Macos,Applescript,Osascript,Javascript Automation,我有一个用JavaScript编写的脚本,它需要运行一小段AppleScript(为了实现一些我在JS中由于许多因素而无法实现的功能) 它应该能够接受单个字符串参数,并且几乎是一个tell-endtell-one行程序 是否可以在JavaScript中将此nano程序组装为字符串,然后将该字符串传递给AppleScript环境执行,这将如何实现 关于如何从Applescript运行JavaScript,在线上有很多解释,但从另一个角度讲就没有那么多了 这很可能涉及到shell调用osascrip

我有一个用JavaScript编写的脚本,它需要运行一小段AppleScript(为了实现一些我在JS中由于许多因素而无法实现的功能)

它应该能够接受单个字符串参数,并且几乎是一个tell-endtell-one行程序

是否可以在JavaScript中将此nano程序组装为字符串,然后将该字符串传递给AppleScript环境执行,这将如何实现

关于如何从Applescript运行JavaScript,在线上有很多解释,但从另一个角度讲就没有那么多了


这很可能涉及到shell调用osascript-e来实现,还是有更干净、更可靠的JXA ey方法?

使用标准添加的
运行脚本
命令


(顺便说一句,我的标准建议是坚持使用AppleScript实现应用程序自动化,因为它是唯一[受支持的]正确的选择。JXA的各种错误、缺陷和遗漏在出厂前就已经知道了,苹果当时也懒得去修复它们,所以现在自动化团队已经被淘汰了,它们肯定不会被修复。整个Mac自动化平台正在消亡,但至少AppleScript应该比JXA慢一点,w这一点从一开始就不正确。)

这是一个用于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');

})();
(() => {
    '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'
    );
})();