我想要这个 AppleScript 片段的 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})
但这似乎不必要地复杂。有没有更好的方式 到达 POSIX 路径 不使用 Foundation API 或手动字符串争吵?
如果我天真地尝试这个:
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()
任何帮助将不胜感激!
最佳答案
这么简单的一段 AppleScript 代码没有直接的 JXA 翻译,这一事实证明了 基于 OSA 脚本编写的 JXA 和 macOS 自动化的遗憾状态 :
正如你自己的例子所表明的,在两种濒临灭绝的自动化脚本语言中 AppleScript - 尽管有很多缺点 - 是更成熟、更可靠的选择 .
为了解决您在 JXA 中的问题,您似乎自己想出了最好的方法。
让我把它打包成 辅助函数这可能在某种程度上减轻了痛苦 - 需要明确的是:这样的辅助功能不应该是必要的:
// Helper function: Given a Finder window, returns its folder's POSIX path.
// Note: No need for an ObjC.import() statement, because NSURL is
// a Foundation class, and all Foundation classes are implicitly
// available.
function posixPath(finderWin) {
return $.NSURL.alloc.initWithString(finderWin.target.url()).fileSystemRepresentation
}
// Get POSIX path of Finder's frontmost window:
posixPath(Application('Finder').finderWindows[0])
关于applescript - 使用 JXA AppleScript 获取事件 Finder 窗口的 POSIX 路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45426227/