就像之前的Leopard's Scripting Bridge 一样,JXA 故意破坏了各种在 AppleScript 中完美运行的东西。以下是将原始 AppleScript 命令翻译成 JXA 语法:
//tell application "System Events" to name of items in folder "/usr"
Application('System Events').folders.byName('/usr').items.name()
AS 版本完美运行,但 JXA 等效版本只是抛出一个完全没有意义的Error -1700: Can't convert types.
如果你写 diskItems 而不是 items,JXA 似乎确实有效:
Application('System Events').folders.byName('/usr').diskItems.name()
// --> ["bin", "lib", "libexec", "local", "sbin", "share", "standalone", "X11", "X11R6"]
这表明 JXA 沉迷于导致 SB 在许多应用程序上崩溃的相同内部“聪明”。 (请注意,我在早期的测试中发现了许多此类设计缺陷,但一旦明确 AS 开发人员只关心将自己的个人意识形态和偏见强加给其他人,我就放弃了报告它们,该死的能力和兼容性受损。)
作为比较,这是几个月前我快速整理的 JavaScriptOSA (JOSA) prototype 供 JXA 开发人员参考(他们很快就忽略了它,natch):
app('System Events').folders.named('/usr').items.name()
// -> ["bin", "lib", "libexec", "local", "sbin", "share", "standalone", "X11", "X11R6"]
(虽然还没有完全完成或测试,但 JOSA 仍然比 JXA 工作得更好,文档更好,甚至包括一个自动翻译工具,用于将 AS 命令转换为 JS 语法。不幸的是,因为 Apple 已经遗留或弃用了AEM、CM、PM 和 OSA Carbon API,我不建议将其用于生产用途;它纯粹是为了比较。)
同样:
set myPath to POSIX file "/usr"
tell application "System Events" to name of every disk item of folder named myPath
--> {"bin", "lib", "libexec", "local", "sbin", "share", "standalone", "X11", "X11R6"}
myPath = Path('/usr')
Application('System Events').folders.byName(myPath).diskItems.name()
// Error -1728: Can't get object.
var myPath = Path('/usr')
app('System Events').folders.named(myPath).diskItems.name()
// --> ["bin", "lib", "libexec", "local", "sbin", "share", "standalone", "X11", "X11R6"]
您可以通过将 Path 对象转换为字符串并使用它来解决这种特殊情况:
myPath = Path('/usr')
Application('System Events').folders.byName(myPath.toString()).diskItems.name()
虽然这种解决方法在其他情况下不一定有帮助;例如它在 Finder 中失败,因为 Finder 不理解 POSIX 样式的路径字符串,并且无法从 JXA Path 对象获取 HFS 样式的路径字符串(Finder 确实可以理解):
set myPath to POSIX file "/usr"
tell application "Finder" to name of every item of item myPath
--> {"X11", "X11R6", "bin", "lib", "libexec", "local", "sbin", "share", "standalone"}
myPath = Path('/usr')
Application('Finder').folders.byName(myPath.toString()).items.name()
// Error -1728: Can't get object.
就这样。 (例如,尝试测试 JXA 对范围、过滤器、相对和插入的支持 reference forms;它特别烂。)