4

我使用 JXA 为Alfred 2编写工作流脚本,最近尝试从另一个脚本中运行一个脚本。我需要在脚本之间传递一些文本,所以我决定使用参数,但是每当我尝试传递一个字符串、一个数字、一个数组或其他任何不是它的对象时,它都会给出错误“ Error on line 4: Error: An error occurred.”。如果我确实传递了一个对象,那么第二个脚本(由第一个脚本运行的那个)会收到一个空对象,而不是传递给它的那个。当第一个脚本是 AppleScript 时也会发生同样的情况,但如果第二个脚本是 AppleScript,则一切正常。osascript从命令行传递参数也可以。API是否损坏或我做错了什么?

第一个脚本:

var app = Application.currentApplication();
app.includeStandardAdditions = true;

app.runScript(new Path("/path/to/second/script.scpt"), { withParameters: "Hello World!" });

第二个脚本:

function run(args) {
    return args;
}

编辑:

如果第二个脚本编辑如下,会显示对话框,但runScript第一个脚本的方法仍然返回错误。

function run(args) {
    var app = Application.currentApplication();
    app.includeStandardAdditions = true;

    app.displayDialog(args.toString());

    return args;
}

编辑2:

除了参数问题之外,该runScript函数实际上似乎运行良好。错误实际上并没有被抛出,只是由脚本编辑器显示,并且在调用之后继续执行,runScript就好像什么都没发生一样。尽管参数不起作用,但返回的值也可以正常工作。

关于 Alfred 2 工作流程的说明

要在 Alfred 2 中运行某些代码(由搜索、键盘命令等触发),必须将其输入到应用程序的框中,而不是文件中。 输入代码的框非常小,不提供语法高亮,这使得编辑代码变得困难和烦人。对于较小的文件,没关系,但对于较大的文件,使用短脚本运行脚本文件更容易。我试过 Bash,这将是最简单的选项,但 Alfred 2 没有提供转义单引号的选项。我也不能使用脚本库(据我所知,如果我错了,请纠正我),因为代码不在脚本包中,并且所有必需的文件都需要在同一个文件夹中(出于导出原因)。

4

1 回答 1

0

我不知道如何避免该runScript错误,但我可以建议一种替代方法:将脚本加载为脚本库。

使用脚本库

将脚本转换为库就像将脚本保存到~/Library/Script Libraries. 如果您的脚本文件已命名script.scpt并具有运行处理程序,并且您将其保存到Script Libraries文件夹中,那么您可以从另一个脚本中调用它,如下所示:

Library("script").run(["Hello, world!"])

脚本库记录在OS X 10.10 的 JXA 发行说明、介绍 JXA的WWDC 2014 会议视频AppleScript 语言指南中。

在脚本包中嵌入脚本库

根据脚本库的 AppleScript 语言指南文档,有一个查找Script Libraries文件夹的搜索策略。它搜索的第一个地方是:

如果引用该库的脚本是一个包,则该脚本的包资源目录。这意味着脚本可以与它们使用的库一起打包和分发。

要将其应用于问题中给出的示例,您需要将第一个脚本重新保存为脚本包,然后将第二个脚本嵌入到第一个脚本中。

例如,如果您将第一个脚本重新保存为script.scptd,那么您可以将第二个脚本保存embedded.scptscript.scptd/Resources/Script Libraries/embedded.scpt. 然后您应该能够使用Library('embedded')来访问脚本库。

要将现有脚本重新保存为脚本包,您可以使用File > Export...脚本编辑器中的菜单项,也可以在选择菜单时按住选项File以显示File > Save As...菜单项。File Format弹出菜单可让您选择格式Script bundle

打开脚本包后,您可以使用Show Bundle Contents菜单项或工具栏按钮显示包内容面板。然后,您可以使用齿轮菜单在Script Libraries文件夹内创建文件Resources夹,然后您可以将脚本拖到该文件夹​​中。

于 2016-01-29T18:06:17.957 回答