【问题标题】:How can I get the posix path of a file that is selected by Finder?如何获取 Finder 选择的文件的 posix 路径?
【发布时间】:2017-01-28 06:16:26
【问题描述】:

我正在尝试获取 Finder 选择的文件的完整路径。至此,我尝试了很多方法:

>> Application('Finder').selection()[0]
=> Application("Finder").startupDisk.folders.byName("Users").folders.byName("example").folders.byName("Tools").folders.byName("my-tools").documentFiles.byName("example.sh")
>>
>> Application('Finder').selection()[0].name()
=> "example.sh"
>>
>> Application('Finder').selection()[0].toString()
=> "[object ObjectSpecifier]"
>>
>> Application('Finder').selection()[0].posixPath()
!! Error on line 1: Error: Can't get object.
>>
>> Application('Finder').selection()[0].path()
!! Error on line 1: Error: Can't get object.
>>
>> Application('Finder').selection()[0].url()
=> "file:///Users/example/Tools/my-tools/example.sh"
>>
>> Path(Application('Finder').selection()[0])
!! Error on line 1: Error: Can't get object.
>>
>> Path(Application('Finder').selection()[0]).toString()
!! Error on line 1: Error: Can't get object.

这些命令都没有获得/Users/example/Tools/my-tools/example.sh的posix路径。

最终,我知道我可以简单地将file:// 从网址前面去掉:

>> Application('Finder').selection()[0].url().replace(/^file:\/\//, '')
=> "/Users/example/Tools/my-tools/example.sh"

但这似乎很hacky,似乎应该有一个命令可以直接获取posix路径。

【问题讨论】:

  • 另外,如果有 JXA 的 API 文档,如果有人能指点我,我将不胜感激。我知道the JXA Cookbookthe JXA Release Notes,但我没有看到任何文档仅显示每个对象(例如文件)存在的所有方法和属性。
  • JXA 使用由可自动化应用程序和脚本扩展提供的 AppleEvent 定义,就像 AppleScript 一样。要查看此类库的文档,请打开脚本编辑器,将库窗口设置为显示,在此处找到相关的应用程序或扩展(在本例中为:Finder),双击它以打开库查看器。有一个下拉菜单可以选择显示文档的语言;如果您主要使用 JXA,您还可以在脚本编辑器首选项中将其设置为标准语言,文档也应遵循。

标签: javascript javascript-automation


【解决方案1】:

如果您检查the file's properties(),您将看到包含完整路径的唯一属性是url()。但是,在使用url() 属性时,特殊字符被转义,并且url 以file:// 协议为前缀:

>> Application('Finder').selection()[0].name()
=> "asdf\"asdf.txt"
>>
>> Application('Finder').selection()[0].url()
=> "file:///Users/example/Tools/my-tools/asdf%22asdf.txt"

为了得到POSIX路径,可以unescape()url(),去掉file://开头的file://协议:

>> unescape(Application('Finder').selection()[0].url()).replace(/^file[:]\/\//, '')
=> "/Users/example/Tools/my-tools/asdf\"asdf.txt"

【讨论】:

  • 更简单:Path(decodeURI(Application('Finder').selection()[0].url())) 为您提供有效的 Path 对象(JXA 等效于 AppleScript 别名)。编码和解码 URI 是 JavaScript 真正 为您提供的内容,并且 Path 对象足够智能,可以处理 file:// 协议前缀。
猜你喜欢
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
  • 2010-12-24
  • 1970-01-01
  • 2012-04-06
  • 2016-10-12
相关资源
最近更新 更多