【问题标题】:Permissions error when running another JS AppleScript from another JSAppleScript从另一个 JSAppleScript 运行另一个 JS AppleScript 时出现权限错误
【发布时间】:2016-05-12 03:00:02
【问题描述】:

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

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

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

组跟踪 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 文件是否可行?

【问题讨论】:

    标签: javascript permissions applescript javascript-automation


    【解决方案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之类的代码来定义

    【讨论】:

      【解决方案2】:

      我不确定您要完成什么,但这对我在 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;
       }

      【讨论】:

      • 我发现我无法将 RegEx 或函数传递/返回到库。不知道还有什么我不能通过/返回。但是,有了 require,它就可以一起运行了。
      • 这个问题是我希望能够轻松地分发脚本,除非我将脚本放在脚本包中,否则这是无法做到的。但是 git 不会显示更改,因为 .scpt 文件不是文本文件。我相信我可以通过编写构建脚本来解决这个问题...
      【解决方案3】:

      嗯,已经好几年了……

      当我尝试使用 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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多