如何从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' 
    ); 
})();