【发布时间】:2018-01-07 15:16:06
【问题描述】:
我想要这个 AppleScript sn-p 的 JXA 等效项:
tell application "Finder"
# Get path
set currentTarget to target of window 1
set posixPath to (POSIX path of (currentTarget as alias))
# Show dialog
display dialog posixPath buttons {"OK"}
end tell
我得到的最接近的是使用url 属性来初始化Foundation NSURL 对象并访问它的fileSystemRepresentation 属性,如下所示:
// Get path
var finder = Application('Finder')
var currentTarget = finder.finderWindows[0].target()
var fileURLString = currentTarget.url()
// I'd like to get rid of this step
var fileURL = $.NSURL.alloc.initWithString(fileURLString)
var posixPath = fileURL.fileSystemRepresentation
// Show dialog
finder.includeStandardAdditions = true
finder.displayAlert('', {buttons: ['Ok'], message: posixPath})
但这似乎不必要地复杂。是否有更好的方法可以在不使用 Foundation API 或手动字符串处理的情况下访问 POSIX 路径?
如果我天真地尝试这个:
finder.finderWindows[0].target().posixPath()
我收到此错误:
app.startupDisk.folders.byName("Users").folders.byName("kymer").folders.byName("Desktop").posixPath()
--> Error -1728: Can't get object.
这个SO answer 似乎相关,但我似乎无法调整它以满足我的需要:
App = Application.currentApplication()
App.includeStandardAdditions = true
SystemEvents = Application('System Events')
var pathToMe = App.pathTo(this)
var containerPOSIXPath = SystemEvents.files[pathToMe.toString()].container().posixPath()
任何帮助将不胜感激!
【问题讨论】:
-
Cocoa API 有什么问题?它比发送 Apple 事件要快得多。
-
@vadian:这是一个简单的脚本任务,它应该有一个简单的JXA-only解决方案,类似于(相当)简单的AppleScript - 唯一的解决方案。在这种简单的情况下,要求脚本编写者诉诸 基础 API(在这种情况下是 Foundation,而不是 Cocoa,顺便说一句)是一种不必要的负担,代表了可以避免的飞跃在必要的知识方面。
-
@mklement0 我知道它是基金会,我只是引用了问题中的一句话。但是,您也建议在答案中使用
NSURL。 -
@vadian:我am 建议
NSURL,因为它是考虑到情况 最简单、最可靠的解决方案,但是,绝对是明确:这不应该是必要的。我在回答中已经更清楚地说明了这一点。 -
关于 NSURL 是 Foundation 而不是 Cocoa 的一部分的好处。编辑了问题。使用它没有任何错误,但我希望它没有必要。由于 mklement0 提到的原因,我更喜欢纯 JXA 解决方案(不诉诸手动字符串操作)。
标签: applescript macos-sierra finder javascript-automation