0

如果我创建一个名为 myscript.js 的 AppleScript 脚本并将其传递给 oascript,它将执行一次 run 函数并将“hello world”写入标准数据输出:

function run(args) {

  for (var i=0;i<10;i++) {
     // out("number " + i); // execution error: Error on line 18: ReferenceError: Can't find variable: out (-2700)
  }

  return "hello world"; // written to standard data out
}

但是,如果我想多次写入标准数据,例如在 for 循环中,我该怎么做?

如果我执行以下操作,它会多次写入标准错误并在外部应用程序中调度多个事件:

  for (var i=0;i<10;i++) {
     console.log("number " + i);
  }

唯一的问题是它正在创建错误事件而不是标准数据事件。

在脚本编辑器中,标准数据输出被发送到结果窗口。我想多次打印到结果窗口。 从 Mac OSX 脚本编辑器

更新:
看起来这可能是不可能的。我在这里找到了这句话:

问:我的脚本会在很长一段时间内产生输出。当他们进来时,我如何阅读结果?

答:同样,简短的回答是你不这样做——在命令完成之前,shell 脚本不会返回。在 Unix 术语中,它不能用于创建管道。但是,您可以做的是将命令置于后台(请参阅下一个问题),将其输出发送到文件,然后在文件填满时读取文件。

另外,请注意,如果我想使用 JavaScript 而不是 AppleScript,我应该使用cocoascript而不是osascript吗?

4

2 回答 2

2

“另外,我应该用 cocoascript 代替 osascript 吗?”</p>

TL;DR:如果你喜欢 JavaScript,那么. 去节点!


长版:

JXA(用于自动化的 JavaScript)存在缺陷且不成熟,几乎没有用户文档、工具、库或社区。负责交付它的 Apple 团队于 2016 年正式解散并重新分配/解雇,整个 macOS 自动化平台自 10.13 以来一直处于维护模式(并且已经烂尾了!)。在经历了 25 年的持续忽视、管理不善和搞砸之后,无需专家就能猜出 Apple 的传统、仅限 Mac 的自动化技术现在将走向何方。

CocoaScript 有效……仅此而已。它是第三方开源软件,因此至少它不依赖于 Apple 的持续开发和支持,但它从未发展出足够庞大和充满活力的用户社区来使其获得广泛的成功。快速浏览一下 GitHub 上的 CocoaScript/Mocha 项目同样表明除了基本维护之外没有正在进行的开发。

这并不是说你不能使用它们 [……暂时],但除非你有无可避免的令人信服的理由这样做,否则现在只有一个JS 平台很重要:Node.js。

与上述不同的是,Node 享有巨大的全球投资、开发、工具、文档、社区和市场增长。(2016 年有 350 万用户并且还在增长!)完全开源和独立。几乎可以在所有重要的操作系统平台上运行:Windows、Mac、Linux;甚至安卓。NPM 也是一种非凡的资源:使用 PyPI、RubyGems 等轻松实现。(甚至还有用于 Cocoa 和 Apple 活动的 macOS 库,尽管由于 Apple 日益混乱的平台的所有影响和不确定性,现在两者可能都需要一些 TLC。)哦,还有大量的工作和 FOSS 项目机会,如果你有朝一日希望成为专业人士也。

高温高压


ps 要回答您最初的问题,请使用-[NSFileHandle fileHandleWithStandardOutput]获取到 stdout 的管道并-writeData:根据需要多次调用其方法,传递(例如)通过作为它的参数NSData创建的实例。[[NSString stringWithString: aMessage] dataUsingEncoding: NSUTF8StringEncoding]或者,你知道,只是忽略所有这些并节点它!;)

/relurk

于 2018-01-11T22:23:25.653 回答
0

A script is an expression which evaluates to a final value, returned to the caller from the JSContext.

If you want that value to consist of repeated or multiple lines, then that is the value which your script needs to define and return.

(() => {

    // enumFromToInt :: Int -> Int -> [Int]
    const enumFromToInt = (m, n) =>
        n >= m ? Array.from({
            length: Math.floor(n - m) + 1
        }, (_, i) => m + i) : [];

    // unlines :: [String] -> String
    const unlines = xs => xs.join('\n');

    return unlines(
        enumFromToInt(1, 25)
        .map(n => n.toString() + " hello")
    );
})()
于 2018-01-27T23:55:45.907 回答