使用`runScript`函数运行JXA脚本不允许使用参数

时间:2016-01-29 12:50:32

标签: javascript applescript jxa

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

第一个脚本:

osascript

第二个脚本:

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

编辑2:

除了参数问题之外,function run(args) { var app = Application.currentApplication(); app.includeStandardAdditions = true; app.displayDialog(args.toString()); return args; } 函数实际上似乎工作得很好。实际上并没有抛出错误,只是由脚本编辑器显示,并且在调用runScript之后继续执行,就像没有发生任何事情一样。尽管参数不起作用,返回的值也能很好地工作。

关于Alfred 2工作流程的说明

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

1 个答案:

答案 0 :(得分:0)

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

使用脚本库

将脚本转换为库可以像将脚本保存到~/Library/Script Libraries一样简单。如果您的脚本文件名为script.scpt且具有运行处理程序,并将其保存到Script Libraries文件夹,则可以从其他脚本调用它,如下所示:

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

脚本库记录在JXA release notes for OS X 10.10WWDC 2014 session video introducing JXAAppleScript Language Guide中。

在脚本包中嵌入脚本库

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

  

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

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

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

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

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