如何多次使用JavaScript或AppleScript写出标准数据?

时间:2018-01-11 04:21:14

标签: javascript applescript osascript cocoascript

如果我创建一个名为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);
  }

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

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

更新
看起来可能不可能。我找到了这句话here

  

问:我的脚本会在很长一段时间内产生输出。我怎么读   结果他们进来了?

     

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

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

2 个答案:

答案 0 :(得分:1)

“另外,我应该使用cocoascript而不是osascript吗?”

TL; DR:如果你喜欢JavaScript,既不。的 Go Node!

长版:

JXA(用于自动化的JavaScript)是错误的,一半都是半生不熟的,几乎没有用户文档,工具,库或社区。负责交付它的Apple团队于2016年正式解散并重新分配/解雇,整个macOS Automation平台从10.13开始陷入维护模式(并且已经过bitrotting!)。经过四分之一世纪的持续忽视,管理不善和搞砸之后,专家无法猜测苹果公司的传统,仅限Mac,自动化技术现在的发展方向。

CocoaScript工作......就是这样。它是第三方开源软件,所以至少它不依赖于Apple的持续开发和支持,但它从来没有成长为一个足够庞大和充满活力的用户社区,使其成为一个受欢迎的成功。快速浏览一下GitHub上的CocoaScript / Mocha项目同样表明,除了必要的维护之外,还没有持续的开发。

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

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

HTH

P.S。要回答您的原始问题,请使用-[NSFileHandle fileHandleWithStandardOutput]获取stdout管道并根据需要多次调用其-writeData:方法,传递(例如)通过{{1}创建的NSData实例作为它的论点。或者,你知道,只要忽略所有这些并节点吧! ;)

/ relurk

答案 1 :(得分:0)

脚本是一个表达式,它计算结果,从JSContext返回给调用者。

如果您希望该值由重复或多行组成,那么这是您的脚本需要定义和返回的值。

(() => {

    // 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")
    );
})()