AppleScript: я скопировал выделение Finder в буфер обмена. Могу ли я получить полный путь к скопированным элементам? - PullRequest
0 голосов
/ 15 августа 2010

У меня есть один или несколько файлов и / или папок, выбранных в Finder. Я вручную копирую их в буфер обмена / буфер обмена ( ⌘C ).

Для простоты, скажем, я просто скопировал один обычный файл. Идеальным решением, однако, было бы иметь дело со многими файлами и смешанным выбором папок, псевдонимов.

Теперь, когда этот файл находится в буфере обмена, я хочу получить его полный путь (предпочтительно путь POSIX).


Чтобы сэкономить ваше время:

  • Я ищу решение AppleScript (или rb-appscript).
  • Я не хочу получать путь непосредственно из выбора. Это должно быть из пункта в буфере обмена.
  • Действительно, я знаю, что могу обойти это путем, сначала скопировав пути к выбору, а затем сделав все, что у меня есть.

Что я знаю до сих пор (отмечено в rb-appscript):

  • OSAX.osax.the_clipboard содержит строку с именами файлов без пути.
  • Appscript.app('Finder').clipboard.get, по-видимому, не реализовано (в словаре написано «НЕДОСТУПЕН ДА»; вызов его возвращает :missing_value.

Ответы [ 5 ]

2 голосов
/ 15 августа 2010

Вот яблочный скрипт, который получит все пути posix из буфера обмена, а не только первый ...

set theFiles to paragraphs of (get the clipboard)

set posixPaths to {}
repeat with aFile in theFiles
    try
        tell application "Finder" to set thePath to item aFile as text
        set end of posixPaths to (POSIX path of thePath)
    end try
end repeat
return posixPaths
2 голосов
/ 15 августа 2010

Кажется, что следующий AppleScript добивается цели:

POSIX path of (the clipboard as «class furl»)

Если в буфере обмена несколько элементов, он вернет путь POSIX только для первого элемента.

Также см. Справочную команду AppleScript для команды the clipboard.


rb-appscript версия:

OSAX.osax.the_clipboard(:result_type => :file_url).path
0 голосов
/ 19 октября 2018

Я искал решение, которое бы копировало путь к файлам, выбранным в Finder. Вот что я придумал:

set ASTID to AppleScript's text item delimiters --——>>
set AppleScript's text item delimiters to return

tell application "Finder" to set sel to the selection as text

set listPaths to {}
repeat with pth in paragraphs of sel
    set end of listPaths to POSIX path of pth
end repeat

set listPathsClipboard to listPaths as text
set AppleScript's text item delimiters to ASTID --——<<

set the clipboard to listPathsClipboard
0 голосов
/ 23 августа 2010

Finder - это то, что он есть, а AppleScript - то, чем он является, слишком сложно обойтись. Итак, какого черта я прыгнул в Какао.

Любой из этих сценариев вернет список абсолютных путей, каждый на новой строке.

MacRuby:

#!/usr/bin/env macruby
# encoding: UTF-8
framework 'Cocoa'
puts NSPasteboard.generalPasteboard.pasteboardItems
  .map { |pbi| pbi.stringForType('public.file-url') }.compact
  .map { |url| NSURL.URLWithString(url).path }

Nu:

#!/usr/bin/env nush
(puts ((((((NSPasteboard generalPasteboard) pasteboardItems)
  map:    (do (pbi) (pbi stringForType: "public.file-url")))
  select: (do (url) (url)))
  map:    (do (url) ((NSURL URLWithString: url) path))) componentsJoinedByString: "\n"))
0 голосов
/ 15 августа 2010

просто подумал, что поделюсь кодом rb-appscript, который я написал после ответа Сакры:

#!/usr/bin/arch -i386 /usr/bin/ruby
require "rubygems"
require "osax"
include OSAX


def path_from_clipboard
  osax.clipboard_info.flatten.include? :file_url or raise "clipboard does not contain path data" 
  osax.the_clipboard.count("\r") == 0            or raise "clipboard contains more than one path"
  osax.the_clipboard(:result_type => :file_url).path
end

puts path_from_clipboard
...