Javascript 使用“runScript”函数运行JXA脚本不允许使用参数

Javascript 使用“runScript”函数运行JXA脚本不允许使用参数,javascript,applescript,javascript-automation,Javascript,Applescript,Javascript Automation,我使用JXA为工作流编写脚本,最近尝试从另一个脚本中运行脚本。我需要在脚本之间传递一些文本,所以我决定使用参数,但每当我尝试传递字符串、数字、数组或其他非对象的内容时,它都会给出错误“第4行的错误:错误:发生错误。”。如果我确实传递了一个对象,那么第二个脚本(第一个脚本运行的脚本)将接收一个空对象,而不是传递给它的对象。当第一个脚本是AppleScript时也会发生同样的情况,但如果第二个脚本是AppleScript,则所有脚本都能完美工作。从命令行通过osascript传递参数也有效。是API

我使用JXA为工作流编写脚本,最近尝试从另一个脚本中运行脚本。我需要在脚本之间传递一些文本,所以我决定使用参数,但每当我尝试传递字符串、数字、数组或其他非对象的内容时,它都会给出错误“
第4行的错误:错误:发生错误。
”。如果我确实传递了一个对象,那么第二个脚本(第一个脚本运行的脚本)将接收一个空对象,而不是传递给它的对象。当第一个脚本是AppleScript时也会发生同样的情况,但如果第二个脚本是AppleScript,则所有脚本都能完美工作。从命令行通过
osascript
传递参数也有效。是API坏了还是我做错了什么

第一个脚本: 第二个脚本: 编辑: 如果按照以下方式编辑第二个脚本,则会显示对话框,但第一个脚本的
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,这是最简单的选项,但是alfred2没有提供一个转义单引号的选项。我也不能使用脚本库(据我所知,如果我错了,请纠正我),因为代码不在脚本包中,并且所有必需的文件都需要在同一文件夹中(出于导出原因)。

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

使用脚本库 将脚本转换为库非常简单,只需将脚本保存到
~/library/script Libraries
。如果脚本文件名为
script.scpt
,并且有一个运行处理程序,并将其保存到
script Libraries
文件夹中,则可以从其他脚本调用它,如下所示:

Library("script").run(["Hello, world!"])
脚本库记录在、和中

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

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

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

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

要将现有脚本重新保存为脚本包,您可以使用脚本编辑器中的
文件>导出…
菜单项,也可以在选择
文件
菜单时按住该选项,以显示
文件>另存为…
菜单项。
文件格式
弹出菜单允许您选择
脚本包
格式


打开脚本捆绑包后,可以使用
显示捆绑包内容
菜单项或工具栏按钮显示捆绑包内容面板。然后,您可以使用gear菜单在
Resources
文件夹中创建
脚本库
文件夹,然后您可以将脚本拖动到该文件夹中。

这并不理想,因为Alfred 2工作流应包含指定工作流文件夹中的所有必需文件,因为这允许它作为一个单独的文件分发,并自行安装。如果
脚本库
文件夹中有脚本,则最终用户也必须手动安装此文件。有没有办法将任何脚本(不仅仅是
脚本库
文件夹中的脚本)作为
对象加载?从最初的问题来看,这一约束并不清楚,因为您在示例中使用了绝对占位符路径(“/path/to/second/script.scpt”),而不是相对于第一个脚本的路径。我更新了我的答案,描述了如何将脚本库嵌入到另一个脚本中,以便它们可以一起分发。我认为这将使它作为Alfred 2工作流更好地工作。这是不可能的,因为脚本1不是保存为文件,而是在Alfred 2的对话中输入的。我已经为这个问题添加了一个解释。
如果第二个脚本是AppleScript,那么它就可以完美地工作。从命令行通过osascript传递参数也有效。API是坏了还是我做错了?
——这是一个很好的问题。无法将参数传递给JXA脚本的原因是,用于调用此类脚本的OS X API NSUserScriptTask没有提供传递参数的方法。只要苹果没有添加这种功能,其他脚本代码,比如从脚本中调用另一个脚本,也无法做到这一点。不过,我无法理解苹果为什么不增加这种能力。我在莫哈韦的表现略有不同。如果我用参数传递{withParameters
function run(args) {
    var app = Application.currentApplication();
    app.includeStandardAdditions = true;

    app.displayDialog(args.toString());

    return args;
}
Library("script").run(["Hello, world!"])