从另一个JSAppleScript运行另一个JS AppleScript时出现权限错误

Permissions error when running another JS AppleScript from another JSAppleScript

本文关键字:另一个 错误 权限 AppleScript JSAppleScript 运行 JS      更新时间:2023-09-26

我正试图将.appescription文件分离成不同的文件来整理。

我有一个名为Test.applescript的JS AppleScript文件,它试图运行JS AppleScript文件Group Tracks Dependency.applescript,我想做的是将一个参数传递到依赖脚本中,并从中获得一个返回值。

Test.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);
}

Group Tracks Dependency.appscript

(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文件是否可行?

我认为您可能正在进行一场使用.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

我不确定你想完成什么,但这对我来说是可行的,使用OSX 10.11.4:上的脚本编辑器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;
 }

好吧,已经几年了。。。

当我尝试使用Application("Finder")运行时,我遇到了JXA和doShellScript的错误。当我从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。

相关文章: