我开始尝试在 OS X Yosemite 中将我的一些 AppleScript 转换为 JavaScript,但我不明白我应该如何从应用程序访问枚举。例如 - Adium 的状态。
在 AppleScript 中:
tell application "Adium"
if status type of global status is offline then
log "offline"
end if
end tell
Run Code Online (Sandbox Code Playgroud)
在 JavaScript 中,我不知道如何访问“离线”枚举:
if(Application('Adium').globalStatus.statusType == ?????) {
console.log("offline");
}
Run Code Online (Sandbox Code Playgroud)
我尝试过简单的事情,比如“离线”,但没有成功。所有这些都是错误:
Application('Adium').StatusType("offline"); // error
Application('Adium').StatusType.offline; // undefined
Application('Adium').StatusType.make({name:"offline"}); // error
Run Code Online (Sandbox Code Playgroud)
有人得到过这样的工作吗?
javascript macos applescript osx-yosemite-beta javascript-automation
如何在 OS X JavaScript 中监听事件以实现自动化。
在消息应用程序的脚本库中有一个事件处理程序列表,例如messageSent和messageReceived。但是,我无法弄清楚如何使用它们。尝试传递函数会产生错误,而尝试将这些变量设置为新函数会导致 REPL 挂起。
设置这些事件处理程序的正确方法是什么?
javascript macos applescript automation javascript-automation
使用脚本编辑器使用新的JS进行自动化.我在下面的最后一行收到错误:
var iTunes = Application("iTunes");
var sources = iTunes.sources();
var library = sources.whose({name : "Library"});
Run Code Online (Sandbox Code Playgroud)
确认sources数组是预期的(两个元素,一个带有name"Library"和一个"Internet Radio").但最后一行扼杀了Error on line 3: TypeError: undefined is not a function (evaluating 'sources.whose({name : "Library"})').
据我所知,我正在使用正确的whose函数语法.(我也尝试使用明确的_equals条款来得到相同的结果.)我做错了什么?
使用 AppleScript,我可以使用以下命令调用 shell 脚本:
do shell script "echo 'Foo & Bar'"
Run Code Online (Sandbox Code Playgroud)
但是我在 Yosemite Script Editor 中找不到使用 JavaScript 的方法。
我正在尝试使用NSAppleScript从Objective-C执行一些AppleScript ...但是,我正在尝试的代码是Yosemite中用于自动化的新JavaScript.它在运行时似乎没有做任何事情,但是,正常的AppleScript工作正常.
[NSApp activateIgnoringOtherApps:YES];
NSAppleScript *scriptObject = [[NSAppleScript alloc] initWithSource:
@"\n\
iCal = Application(\"Calendar\");\n\
iCal.includeStandardAdditions = true;\n\
iCal.activate();\n\
iCal.displayAlert(\"testing\");\n\
"];
[scriptObject executeAndReturnError: nil];
Run Code Online (Sandbox Code Playgroud)
我怎么能让它运行?
谢谢
javascript cocoa applescript objective-c javascript-automation
在AppleScript中,可以使用此行获取当前脚本所在的文件夹的POSIX路径:
POSIX path of ((path to me as text) & "::")
Run Code Online (Sandbox Code Playgroud)
结果示例: /Users/aaron/Git/test/
什么是JavaScript等效项?
macos applescript osascript osx-yosemite javascript-automation
JXA具有内置的 ObjC 桥接器,Foundation可通过对象自动从框架公开枚举和常量$;例如:
$.NSUTF8StringEncoding // -> 4
Run Code Online (Sandbox Code Playgroud)
但是,较低级别 API 中也有一些CFString不会自动导入的有用常量,即定义常用UTIkUTType*值的常量,例如UTI 。CoreServiceskUTTypeHTML"public.html"
虽然您可以使用 导入它们ObjC.import('CoreServices'),但它们的字符串值无法(轻松)访问,大概是因为它的类型是CFString[Ref]:
ObjC.import('CoreServices') // import kUTType* constants; ObjC.import('Cocoa') works too
$.kUTTypeHTML // returns an [object Ref] instance - how do you get its string value?
Run Code Online (Sandbox Code Playgroud)
我还没有找到一种方法来获取返回内容的核心
字符串ObjC.unwrap($.kUTTypeHTML):不起作用,也不起作用ObjC.unwrap($.kUTTypeHTML[0])(也.deepUnwrap())。
我想知道:
ObjC.bindFunction()定义可以解决问题的函数的绑定CFString*(),例如 toCFStringGetCString()或CFStringGetCStringPtr(),但对我来说如何翻译 ObjC …根据Apple的Developer Docs,Library全局允许导入已编译的脚本,以便它们可以在一个当前脚本中用作库.这个工作,如果你是做类似下面的代码就好了myLibName.scpt位于~/Library/Script Libraries:
myLib = Library('myLibName');
myLib.myLibMethod() // Works just fine
Run Code Online (Sandbox Code Playgroud)
但是,文档还声称可以导出一个环境变量 - OSA_LIBRARY_PATH包含一串:分隔的路径 - Library()然后在继续它的默认路径之前推迟到该路径列表:~/Library/Script Libraries.雅知道,就像bash环境变量一样Path.以下是相关的文档; 它描述了路径层次结构:
脚本作为脚本库的基本要求是它的位置:它必须是以下文件夹之一中"脚本库"文件夹中的脚本文档.搜索库时,将按列出的顺序搜索位置,并使用第一个匹配的脚本:
- 如果引用该库的脚本是一个bundle,则该脚本的bundle资源目录.这意味着脚本可以与他们使用的库打包和分发.
- 如果运行脚本的应用程序是一个bundle,那么应用程序的bundle资源目录.这意味着脚本应用程序("applet"和"drops")可以与它们使用的库打包和分发.它还使运行脚本的应用程序能够提供这些脚本使用的库.
- 环境变量OSA_LIBRARY_PATH中指定的任何文件夹.这允许使用库而无需在其中一个常用位置安装它.此变量的值是以冒号分隔的路径列表,例如/ opt/local/Script Libraries:/ usr/local/Script Libraries.与其他库位置不同,OSA_LIBRARY_PATH中指定的路径完全按原样使用,不附加"脚本库".在OS X v10.11及更高版本中受支持.
- 用户主目录中的Library文件夹,〜/ Library.这是安装库供单个用户使用的位置,是库开发期间的推荐位置.
- 计算机库文件夹,/ Library.此处的库可供计算机的所有用户使用.
- 网络库文件夹,/ Network/Library.位于此处的库可用于网络上的多台计算机.
- 系统库文件夹,/ System/Library.这些是OS X提供的库.
- 应用程序的bundle库目录中的任何已安装的应用程序包.这允许分发与应用程序关联的库,或创建仅用于分发库的应用程序.在OS X v10.11及更高版本中受支持.
问题是它不起作用.我已经尝试OSA_LIBRARY_PATH通过我的.zshrc文件导出变量 - 全局- 然后通过脚本编辑器和osascript可执行文件运行上面的示例脚本.什么都行不通; 我收到"找不到文件"错误.我找到了这个帖子 - 参与者放弃了在线的希望 ; 它没有解释太多.有什么想法吗?
在一个有点相关的说明中, …
有人可以帮我制作一个脚本来报告 uielement 的所有子元素及其属性吗?它类似于 WholeContents() 函数。这是我的递归函数。
function iterate(obj) {
for (var property in obj) {
if(obj[property] instanceof Array) {
console.log("Array: " + property + "," +obj[property])
iterate(obj[property])
} else if(obj[property] instanceof Object){
console.log("Object: " + property + ',' + obj[property])
iterate(obj[property])
} else {
console.log("Unknown: " + property +"," + obj[property]);
}
}
}
iterate(app.windows())
Run Code Online (Sandbox Code Playgroud)
我只达到第一级。每个项目下都有一堆 UIElements 和数组。我认为这与 Applescript 返回对象说明符有关,但与实际对象无关?我不确定如何将对象说明符的名称作为函数调用。我尝试了 objproperty、obj.property()、eval("obj." + property + "()"),,但它们都不起作用。我也尝试过 iterate(app.windows())[0]
谢谢您的帮助。
简而言之 - Mac 自动化的 JavaScript 相当于 AppleScript 的as «class utf8»什么?
我有一个 unicode 字符串,我正在尝试使用 JavaScript for Mac Automation 将其写入文本文件。
将字符串写入文件时,任何存在的 unicode 字符都会成为文件中的问号 (ASCII char 3F)。
如果这是一个 AppleScript 脚本而不是 JavaScript 脚本,我可以通过添加as «class utf8»原始语句来解决这个问题,如 Takashi Yoshida 的博客 ( https://takashiyoshida.org/blog/applescript-write-text-as-utf8-string -到文件/)。
但是,该脚本已经用 JavaScript 编写,因此我正在寻找与此 AppleScript 语句等效的 JavaScript。Apple 关于原始语句的页面仅针对 AppleScript ( https://developer.apple.com/library/content/documentation/AppleScript/Conceptual/AppleScriptLangGuide/conceptual/ASLR_raw_data.html )。
要编写文件,我使用 Apple 自己的writeTextToFileJavaScript 函数示例(https://developer.apple.com/library/content/documentation/LanguagesUtilities/Conceptual/MacAutomationScriptingGuide/ReadandWriteFiles.html#//apple_ref/doc/uid/TP40016239- CH58-SW1 )。as根据 StandardAdditions 字典,我向以下调用添加了一个参数:
// Write the new content to the file
app.write(text, { to: openedFile, startingAt: …Run Code Online (Sandbox Code Playgroud) applescript ×9
javascript ×6
macos ×5
objective-c ×3
osx-yosemite ×2
automation ×1
cocoa ×1
osascript ×1