从另一个JSAppleScript运行另一个JS AppleScript时出现权限错误
Permissions error when running another JS AppleScript from another JSAppleScript
我正试图将.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)
- 创建一个主JXA脚本文件
- 创建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。
- 从另一个JSAppleScript运行另一个JS AppleScript时出现权限错误
- Jasmine测试工厂函数调用本地函数和另一个函数-获取错误:应该是间谍,但得到了function
- 将错误消息 JSON 传递到另一个页面模板
- Addeventlistener 已转换为 IE.也许是另一个错误
- 另一个错误:Angular Web应用程序中的[$resource:badcfg]
- 当我把服务放在另一个文件上时,Angular会抛出一个错误
- 另一个未捕获的类型错误::无法读取属性'替换'的未定义
- 从另一个文件调用时出现Javascript作用域错误
- 如果小于另一个值,则 Javascript 将添加到值,错误超过一位数
- 计算当天和另一个日期之间的差额时出现错误差异
- 图像加载,IE中的另一个错误 - 相当确定这不是缓存错误
- 在另一个函数中调用函数 - 未捕获的错误
- 我的启动项目中的JS文件的另一个“断点当前不会被命中”错误
- 从一个框架的页面调用一个javascript函数到另一个框架的页面,给出“权限被拒绝”错误
- JavaScript - 尝试从另一个对象内部访问一个对象方法,得到未定义的错误
- 指向URL的Javascript绝对路径在一个页面上有效,但在另一个页面创建ajax错误消息
- 用html和javascript将错误从一个页面重定向到另一个页面
- 另一个解析'未调用success/error'错误
- 如果我从另一个加载了ajax的php文件调用一个php文件,我会得到错误
- AngularJS验证更新另一个输入字段的错误状态