簡體   English   中英

使用`runScript`函數運行JXA腳本不允許使用參數

[英]Using the `runScript` function to run a JXA script does not allow parameters

我使用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沒有提供逃避單引號的選項。 我也不能使用腳本庫(據我所知,如果我錯了就糾正我),因為代碼不在腳本包中,並且所有必需的文件都需要在同一個文件夾中(出於出口的原因)。

我不知道如何避免runScript錯誤,但我可以建議一種替代方法:將腳本加載為腳本庫。

使用腳本庫

將腳本轉換為庫可以像將腳本保存到~/Library/Script Libraries一樣簡單。 如果您的腳本文件名為script.scpt且有一個運行處理程序,並將其保存到Script Libraries文件夾,那么您可以從另一個腳本調用它,如下所示:

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

腳本庫記錄在OSX 10.10JXA發行說明, 介紹JXAWWDC 2014會話視頻AppleScript語言指南中

在腳本包中嵌入腳本庫

根據腳本庫的AppleScript語言指南文檔,有一個用於查找Script Libraries文件夾的搜索策略。 它搜索的第一個地方是:

如果引用該庫的腳本是一個bundle,則該腳本的bundle資源目錄。 這意味着腳本可以與他們使用的庫打包和分發。

要將此應用於問題中給出的示例,您需要將第一個腳本重新保存為腳本包,然后將第二個腳本嵌入到第一個腳本中。

例如,如果將第一個腳本重新保存為script.scptd ,則可以將第二個腳本embedded.scpt保存到script.scptd/Resources/Script Libraries/embedded.scpt 然后,您應該能夠使用Library('embedded')來訪問腳本庫。

要將現有腳本重新保存為腳本包,可以使用“腳本編輯器”中的“ File > Export...菜單項,也可以在選擇“ File菜單時按住選項以顯示“ File > Save As...菜單項。 File Format彈出菜單允許您選擇“ Script bundle格式。

打開腳本包后,可以使用“ Show Bundle Contents菜單項或工具欄按鈕Show Bundle Contents包內容面板。 然后,您可以使用齒輪菜單在Resources文件夾內創建Script Libraries文件夾,然后將腳本拖動到該文件夾​​中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM