【发布时间】:2018-01-11 04:21:13
【问题描述】:
如果我创建一个名为 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);
}
唯一的问题是它创建了错误事件而不是标准数据事件。
在脚本编辑器中,标准数据输出被发送到结果窗口。我想多次打印到结果窗口。
更新:
看起来这可能是不可能的。我找到了这句话here:
问:我的脚本会在很长一段时间内产生输出。我如何阅读 他们进来的结果?
A:同样,简短的回答是你不会——shell 脚本不会 返回,直到命令完成。在 Unix 术语中,它不能用于 创建一个管道。但是,您可以做的是将命令放入 背景(参见下一个问题),将其输出发送到文件,然后 然后在文件填满时读取文件。
另外,请注意,如果我想使用 JavaScript 代替 AppleScript,我应该使用 cocoascript 代替 osascript 吗?
【问题讨论】:
-
我认为您在 Unix-to-OSA (
osascript) 和 OSA-to-Unix (do shell script) 通信之间感到困惑。您最初的问题询问如何实现前者 - 即如何使 AS/JS shell 进程将数据写入标准输出——而您新添加的脚注仅与后者相关。例如在 Node 中,您通常调用console.log(…)将消息打印到 stdout,调用console.error(…)打印到 stderr,或者如果您需要更大的控制权,请使用process。 -
脚注说我无法将数据发送到
standard data out,直到命令完成并通过return。我不知道这是否正确,因为如果我在脚本编辑器中并且我使用 console.log() 并将其附加到 Safari,它会将输出发送到 Safari 控制台。但如果我在我的 Adobe AIR 中运行它,console.log 会将数据发送到standard error out。如果我return脚本中的一个值,该值将发送到standard data out。 -
忘记脚本编辑器。这是一个 OSA 环境,而不是 Unix 环境,因此不了解或支持 stdout/stderr/etc。给自己找一个像样的纯文本代码编辑器(例如我使用 BBEdit),将
#!/usr/bin/osascript -l JavaScript放在脚本的顶部,然后将其作为 Unix shell 脚本运行。然后,您可以使用NSFileHandle.fileHandleWithStandardOutput().writeData(…)直接写入标准输出,绕过对 OSA 施加的限制。但是,当最佳答案是完全避免 OSA 并首先使用正确的工具来完成工作(Python/Ruby/Node/等)时,这会很麻烦。 -
谢谢。您提到了 JavaScript,但随后又提到了 NS 之类的东西。我猜目标C。我将不得不研究你所说的。现在我的 osascript 在 3 天后工作。我现在会在没有标准数据的情况下生活,或者使用其中一种技巧。
-
NS是 Cocoa 类名的传统前缀,因为它们出现在 ObjC 和大多数 ObjC 桥接语言中(Swift 是一个明显的例外)。如果您打算使用 Cocoa API,那么您真的需要先熟悉 ObjC 语法,然后才能找到适合自己的方法。如果您不需要使用 Cocoa 或 Apple 事件,那么 JXA 除了making your life difficult 之外没有真正的价值;无论哪种方式,都有更好的选择:用于 Cocoa 开发的 Swift、用于桌面自动化的 AppleScript、用于所有 JavaScript 的 Node。
标签: javascript applescript osascript cocoascript