我正在尝试将一些旧的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只会抛出完全没有意义的
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的支持;它特别烂。)
关于javascript - 在Yosemite上使用JavaScript for Automation列出文件夹中的所有文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26301681/