【问题标题】:How do you run inline Applescript from a JXA/JavaScript for Automation script on macOS?如何在 macOS 上从 JXA/JavaScript for Automation 脚本运行内联 Applescript?
【发布时间】:2018-03-19 14:35:45
【问题描述】:

我有一个用 JavaScript 编写的脚本,它需要运行一小段 AppleScript(为了实现一些我因 JS 原生因素而无法实现的功能)。

它应该能够接受单个字符串参数,并且几乎是一个告诉-endtell 一个班轮。

是否可以在 JavaScript 中将这个纳米程序组装成一个字符串,然后将该字符串传递给 AppleScript 环境执行,如何实现?

网上有很多关于如何从 Applescript 运行 JavaScript 的解释,但反之则不然。

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

【问题讨论】:

    标签: javascript macos applescript osascript javascript-automation


    【解决方案1】:

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

    (顺便说一句,我的标准建议是坚持使用 AppleScript 来实现应用程序自动化,因为它是唯一 [支持] 可以正常工作的选项。JXA 的各种错误、缺陷和遗漏在发布之前就已为人所知,而 Apple 无法那时候懒得修了,所以现在自动化团队已经被淘汰了,肯定不会修。反正整个Mac自动化平台都快死了,但至少AppleScript应该比JXA慢一点,这从一开始就不对.)

    【讨论】:

      【解决方案2】:

      这是 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'
          );
      })();
      

      【讨论】:

        猜你喜欢
        • 2017-06-28
        • 2017-06-28
        • 2018-09-05
        • 2017-09-03
        • 2016-02-11
        • 2022-07-10
        • 2016-09-09
        • 2015-04-16
        • 1970-01-01
        相关资源
        最近更新 更多