JXA의 "Error : A privilege violation occurred"회피
10096 단어 AppleScriptjXAMac
Standard Additions
의 메소드를 사용하려고 하면(자) 빈번하게 이하의 에러가 나온다.var finder = Application("Finder");
finder.includeStandardAdditions = true;
finder.doShellScript("date");
//!! Error on line 1: Error: A privilege violation occurred.
이 경우
currentApplication
를 사용하면 아마 대부분 갈 수 있다.var app = Application.currentApplication();
app.includeStandardAdditions = true;
app.doShellScript("date");
//=> "2015年 2月25日 水曜日 17時16分28秒 JST"
currentApplication
는 스크립트를 실행하는 응용 프로그램을 검색하는 메서드입니다.Script Editor에서 실행하고 있으면 Script Editor.
Terminal에서 실행 중이면 Terminal...이 아니라
osascript
명령.Terminal이 직접 실행하는 것은 아니기 때문에.
그 밖에도 예를 들면
CotEditor은 사용자가 만든 스크립트를 사용할 수 있습니다.
거기서 실행했을 경우의
currentApplication
는 Cot Editor.osascript를 볼 때 warning
warning: failed to get scripting definition from/usr/bin/osascript; it may not be scriptable.
라고 매회 나오지만 「osascript에는
.sdef
파일이 없기 때문에, 스크립트로 조작할 수 없다고 생각해」라고만.osascript 자체가 아니라
Standard Additions
의 메소드를 사용하는 것만이니까 문제 없음. 해야합니다.osascript 참조에서 이름을 얻으려고
.name()
라고 하면 오류가 나오므로 주의.라고 할까 이것 불안해질 뿐이니까 표시하지 않으면 좋겠다. 아니 역시 필요?
스크립트 메뉴에서 실행할 때 currentApplication
Script Editor 같은 알기 쉬운 것이라면 좋지만, 스크립트 메뉴에서 실행한 경우는 무엇이 불리는 것인가.currentApplication
는 많이 사용하기 때문에, 득체의 모르는 채로 사용하면 모야모야 한다.
AppleScript와 달리, 명시적으로 Standard Additions
를 유효하게 하지 않으면 안 되고 신경이 쓰였으므로 조사했다.
스크립트 메뉴 정보
스크립트 편집기 설정에서 스크립트 메뉴를 활성화하면 메뉴에 아이콘이 추가됩니다.
스크립트를 ~/Library/Scripts/
에 넣으면 해당 메뉴에 표시됩니다.
컴파일된 스크립트( .scpt
)로 하면 언제 어디서나 한 번의 클릭으로 실행할 수 있다.
덧붙여서 Script Editor를 경유하지 않아도 설정 변경 가능.
var app = Application("AppleScript Utility");
// 確認
app.scriptMenuEnabled();
//=> true / false
// 有効にする
app.scriptMenuEnabled = true;
스크립트 메뉴의 "currentApplication"
이것을 조사하는 스크립트를 JXA로 쓰면 어렵다.
라고 할까 결국, 몰랐다.
AppleScript라면 간단했다.
where_is_current_app.scptdisplay dialog (path to current application)'s POSIX path
스크립트 편집기에서 실행하는 경우.
/Applications/Utilities/Script Editor.app/
스크립트 메뉴에서 실행하는 경우.
/usr/bin/osascript
일반적으로 osascript
이었다.
뱀발
예상에서는 전용의 어플리케이션이 있는지, 최전면의 어플이 사용되는지, Finder인가라고 생각하고 있었다.
옛날은 이것이었던 것 같다. 지금은 존재하지 않는다. (참고: MacWiki )/System/Library/CoreServices/AppleScript Runner.app
스크립트 메뉴에서 오류가 발생하면
아무 일도 일어나지 않는다. 아무것도 통지되지 않습니다.
도중에 단순히 실행이 정지되므로 주의.
제대로 try...catch
하면 괜찮아.
콘솔 .app에 오류 팁이 남아있을 수 있습니다.
뱀발 2
위에 썼지만 currentApplication
의 이름은 AppleScript에서 한 줄로 얻을 수 있었다.
JXA에서 어떻게든 시도하고 있었지만 (할 수 없었던) 코드를 여기에서 공양한다.
var app = Application.currentApplication();
app.includeStandardAdditions = true;
var str = Automation.getDisplayString(app);
// これじゃたぶん意味ない。(osascriptで実行してるじゃん)
//msg = app.doShellScript('osascript -l JavaScript -e "Application.currentApplication()" 2>&1 1> /dev/null | cat');
//str += "\n" + msg;
try { // try..catchしとかないとエラー出たら無言でアプレット消える
str += "\n\nproperties: " + Automation.getDisplayString(Object.getOwnPropertyNames(app));
str += "\nname: " + app.name(); //osascriptから.name()とか呼んだらエラー出る
str += "\n\n" + JSON.stringify(app.properties(), null, " ");
} catch(e){
str += "\n\n" + e.toString();
}
app.displayDialog(str);
스크립트 편집기에서 실행할 때 대화 상자.
Application.currentApplication()
properties: ["__private__"]
name: Script Editor
{
"frontmost": true,
"class": "application",
"name": "Script Editor",
"version": "2.7"
}
스크립트 메뉴에서 실행할 때 대화 상자.
Application.currentApplication()
properties: ["__private__"]
Error: Message not understood.
JXA의 Standard Addisions에도 pathTo
는 있다.
그러나 current application
를 문자열로 전달하거나 currentApplication을 그대로 전달해도 경로를 얻을 수 없습니다.
JXA로 패스를 얻는 방법이 있다면 아는 분은 가르쳐 주세요.
참고
var app = Application("AppleScript Utility");
// 確認
app.scriptMenuEnabled();
//=> true / false
// 有効にする
app.scriptMenuEnabled = true;
display dialog (path to current application)'s POSIX path
아무 일도 일어나지 않는다. 아무것도 통지되지 않습니다.
도중에 단순히 실행이 정지되므로 주의.
제대로
try...catch
하면 괜찮아.콘솔 .app에 오류 팁이 남아있을 수 있습니다.
뱀발 2
위에 썼지만
currentApplication
의 이름은 AppleScript에서 한 줄로 얻을 수 있었다.JXA에서 어떻게든 시도하고 있었지만 (할 수 없었던) 코드를 여기에서 공양한다.
var app = Application.currentApplication();
app.includeStandardAdditions = true;
var str = Automation.getDisplayString(app);
// これじゃたぶん意味ない。(osascriptで実行してるじゃん)
//msg = app.doShellScript('osascript -l JavaScript -e "Application.currentApplication()" 2>&1 1> /dev/null | cat');
//str += "\n" + msg;
try { // try..catchしとかないとエラー出たら無言でアプレット消える
str += "\n\nproperties: " + Automation.getDisplayString(Object.getOwnPropertyNames(app));
str += "\nname: " + app.name(); //osascriptから.name()とか呼んだらエラー出る
str += "\n\n" + JSON.stringify(app.properties(), null, " ");
} catch(e){
str += "\n\n" + e.toString();
}
app.displayDialog(str);
스크립트 편집기에서 실행할 때 대화 상자.
Application.currentApplication()
properties: ["__private__"]
name: Script Editor
{
"frontmost": true,
"class": "application",
"name": "Script Editor",
"version": "2.7"
}
스크립트 메뉴에서 실행할 때 대화 상자.
Application.currentApplication()
properties: ["__private__"]
Error: Message not understood.
JXA의 Standard Addisions에도
pathTo
는 있다.그러나
current application
를 문자열로 전달하거나 currentApplication을 그대로 전달해도 경로를 얻을 수 없습니다.JXA로 패스를 얻는 방법이 있다면 아는 분은 가르쳐 주세요.
참고
Reference
이 문제에 관하여(JXA의 "Error : A privilege violation occurred"회피), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/zakuroishikuro/items/672afaf0f90d3d73c2c0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)