0

我正在尝试将我的 .applescript 文件分成不同的文件来整理。

我有一个名为的 JS AppleScript 文件Test.applescript,它尝试运行 JS AppleScript 文件Group Tracks Dependency.applescript,我想要做的是将参数传入依赖脚本并从中获取返回值。(它创建了一组 iTunes 曲目数组)。

测试.applescript

(function() {
    var app = Application('iTunes');
    app.includeStandardAdditions = true;

    app.doShellScript('Group Tracks Dependency.applescript');

    return "Done";
})();

// For quick logging
function log(obj) {
    this.console.log(obj);
}

组跟踪 Dependency.applescript

(function(selection) {

    return getGroupsOfTracks(selection);

    function getGroupsOfTracks(originalTracksArray) {
        if (originalTracksArray == null || originalTracksArray.length == 0) 
            return null;

        var tracks = originalTracksArray.slice();
        var groups = [];
        while (true) {
            var group = [];
            group.push(tracks[0]);
            tracks = tracks.slice(1);

            while (true) {
                if (!tracks[0]) break;
                if (tracks[0].album() != group[0].album())
                    break;
                if (tracks[0].artist() != group[0].artist())
                    break;
                if (tracks[0].discNumber() != group[0].discNumber())
                    break;
                group.push(tracks[0]);
                tracks = tracks.slice(1);
            }

            groups.push(group);
            if (!tracks[0]) break;
        }

        return groups;
    }
})();

当我尝试运行测试脚本时,出现此错误(第 5 行是该app.doShellScript行):

Error on line 5: Error: A privilege violation occurred.

有没有办法解决这个问题?我还应该注意,我希望其他人将来能够下载这些脚本并在他们自己的 iTunes 库上运行它们(虽然目前它对用户不友好)。

如果没有办法解决这个问题,那么导入另一个 JS AppleScript 文件会起作用吗?

4

3 回答 3

1

我认为您可能正在打一场使用 .doShellScript 无法赢得的战斗。

Apple 的方法是使用https://developer.apple.com/library/mac/releasenotes/InterapplicationCommunication/RN-JavaScriptForAutomation/Articles/OSX10-11.html#//apple_ref/doc/uid/上定义的脚本库TP40014508-CH110-SW1

不幸的是,脚本库有一些限制,您只能传递简单的变量。

另一种方法是使用 require,可以使用https://github.com/dtinth/JXA-Cookbook/wiki/Importing-Scripts之类的代码来定义

于 2016-05-12T04:12:10.033 回答
0

嗯,已经好几年了……

我在使用 JXA 时遇到了错误,doShellScript当我尝试使用Application("Finder"). 当我从Application.currentApplication(). 所以对于我的脚本,我使用const finder = Application("Finder")了 Finder 特定的东西,然后const app = Application.currentApplication()用于运行脚本。

例如:

//test1.scpt
function run() {    
    const app = Application.currentApplication()
    app.includeStandardAdditions = true
    app.doShellScript("osascript ~/Desktop/test2.scpt")
}
//test2.scpt
function run() {
    const app = Application.currentApplication()
    app.includeStandardAdditions = true
    
    app.displayDialog("foo")
    app.doShellScript("osascript -e 'display dialog \"bar\"'")
}

正如预期的那样,运行test1.scpt给了我两个对话框:foo和`bar.

于 2021-04-15T17:48:34.247 回答
0

我不确定您要完成什么,但这对我在 OSX 10.11.4 上使用 Script Editor 2.8.1 (183.1) 有效:

  1. 创建一个主 JXA 脚本文件
  2. 创建 JXA 脚本库文件

这两者都必须保存为已编译的脚本文件 (.scpt)

“不幸的是,脚本库具有只能传递简单变量的约束”,这是不正确的。

您可以从任何 JXA 脚本调用脚本库文件中的任何函数。

在您的 MAIN 脚本文件中,我将其称为“ Get iTunes Group Selection.scpt”:

var app = Application('iTunes');
app.includeStandardAdditions = true;

var myLib = Library("My JXA Lib")

var selectionArr = app.selection()   // ### Change as needed ###
var groupArr = myLib.getGroupsOfTracks(selectionArr)
groupArr

~~~~~~~~~~~~~~~~~~~~~

然后在一个单独的脚本文件中,保存为: ~/Library/Script Libraries/My JXA Lib.scpt

function getGroupsOfTracks(originalTracksArray) {
        if (originalTracksArray == null || originalTracksArray.length == 0) 
            return null;

        var tracks = originalTracksArray.slice();
        var groups = [];
        while (true) {
            var group = [];
            group.push(tracks[0]);
            tracks = tracks.slice(1);

            while (true) {
                if (!tracks[0]) break;
                if (tracks[0].album() != group[0].album())
                    break;
                if (tracks[0].artist() != group[0].artist())
                    break;
                if (tracks[0].discNumber() != group[0].discNumber())
                    break;
                group.push(tracks[0]);
                tracks = tracks.slice(1);
            }

            groups.push(group);
            if (!tracks[0]) break;
        }

        return groups;
 }

于 2016-05-12T22:54:02.393 回答