gpt4 book ai didi

javascript - 在 Yosemite 上使用 JavaScript for Automation 列出文件夹中的所有文件

转载 作者:可可西里 更新时间:2023-11-01 02:53:34 24 4
gpt4 key购买 nike

我正在尝试将一些旧的 Applescript 移植到新的 JavaScript 语法。

有些事情似乎很简单,所以:

tell application "System Events" to keystroke "t" using command down

变成:

System = Application('System Events');
System.keystroke("t", {using: "command down"})

但是我终生无法弄清楚如何在特定位置列出文件。在 AppleScript 中,要返回 /usr 目录中的文件列表,您可以这样做:

tell application "System Events" to set fileList to name of items in folder "/usr"
-- > {"bin", "include", "lib", "libexec", "local", "sbin", "share", "standalone", "X11"}

但是我一辈子都弄不明白如何用 Javascript 来实现。

System = Application('System Events')
myPath = Path("/usr")

fileList = System.items(myPath)
-- > message not understood

fileList = System.folder(myPath)
-- > message not understood

fileList = System.diskItems(myPath)
-- > []

fileList = System.diskItems({at:myPath)
-- > []

我也尝试了很多其他组合,但没有成功。有什么想法吗?

最佳答案

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 版本只是抛出一个完全没有意义的错误 -1700:无法转换类型。

如果您编写 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 路径对象获取 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 ;它特别糟糕。)

关于javascript - 在 Yosemite 上使用 JavaScript for Automation 列出文件夹中的所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26301681/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com