我使用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
除了参数问题之外,function run(args) {
var app = Application.currentApplication();
app.includeStandardAdditions = true;
app.displayDialog(args.toString());
return args;
}
函数实际上似乎工作得很好。实际上并没有抛出错误,只是由脚本编辑器显示,并且在调用runScript
之后继续执行,就像没有发生任何事情一样。尽管参数不起作用,返回的值也能很好地工作。
要在Alfred 2中运行一些代码(由搜索,键盘命令等触发),必须将其键入应用程序的框中,而不是文件中。 输入代码的框非常小,不提供语法高亮,这使编辑代码变得困难和烦人。对于较小的文件,它是可以的,但对于较大的文件,使用短脚本来运行脚本文件更容易。我尝试过Bash,这是最简单的选择,但Alfred 2没有提供逃避单引号的选项。我也不能使用脚本库(据我所知,如果我错了就纠正我),因为代码不在脚本包中,并且所有必需的文件都需要在同一个文件夹中(出于出口原因)。
答案 0 :(得分:0)
我不知道如何避免runScript
错误,但我可以建议另一种方法:将脚本加载为脚本库。
将脚本转换为库可以像将脚本保存到~/Library/Script Libraries
一样简单。如果您的脚本文件名为script.scpt
且具有运行处理程序,并将其保存到Script Libraries
文件夹,则可以从其他脚本调用它,如下所示:
Library("script").run(["Hello, world!"])
脚本库记录在JXA release notes for OS X 10.10,WWDC 2014 session video introducing JXA和AppleScript 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
文件夹,然后将脚本拖到该文件夹中。