Как получить URL файла в OSX с помощью AppleScript или сценария оболочки? - PullRequest
2 голосов
/ 08 марта 2012

Я пытаюсь собрать воедино ярлык Keyboard Maestro, чтобы дать мне URL-адрес файла (точно так же, как те, которые выводит Path Finder).

Пока что я использую следующий AppleScript и заменяю пробелы на % 20 :

tell application "Finder"
    set sel to the selection as text
    set the clipboard to POSIX path of sel
end tell

Тогда я просто добавляю file://localhost/.

Проблема в том, что касается специальных символов, например, я получил следующую папку на рабочем столе:

Мой вывод: file://localhost//Users/patte/Desktop/#%20Old%20files

Правильный вывод должен преобразовывать хеш: file://localhost/Users/patte/Desktop/%23%20Old%20files


Было бы замечательно решение с помощью скрипта AppleScript или Shell, так как я могу это встроить. Я также попробовал set the clipboard to URL of the first item of (get the selection), но у меня это не сработало - возможно, я сделал это неправильно.

Другим вариантом может быть сценарий, который кодирует специальные символы - я мог бы также работать с этим, но я не уверен, что преобразовать во что - иначе я бы искал это.

Ответы [ 5 ]

4 голосов
/ 11 ноября 2012

Вот простой AppleScript, который будет циклически перебирать выделение Finder и помещать URL-адреса файлов в буфер обмена в виде строки с разделителем возврата. Он использует 2-строчный код mklement и может использоваться с Keyboard Maestro:

set theOutput to ""

-- Obtain Finder selection and store it in variable "sel".
tell application "Finder" to set sel to get selection as alias list

repeat with x in sel

-- Convert to alias, then determine its file URL and store that in variable "myFileUrl"
tell application "System Events" to set myFileUrl to URL of x

if theOutput = "" then
    set theOutput to myFileUrl
else
    set theOutput to theOutput & return & myFileUrl
end if

end repeat

set the clipboard to theOutput
4 голосов
/ 08 марта 2012

это почти дословно взято из этого ответа , т. Е. Использовать urllib python для правильного цитирования строки перед добавлением file://localhost к началу строки

on path2url(thepath)
    return do shell script "python -c \"import urllib, sys; print (urllib.quote(sys.argv[1]))\" " & quoted form of thepath
end path2url

tell application "Finder"
    set sel to the selection as text
    set the clipboard to "file://localhost" & my path2url(POSIX path of sel)
end tell

I 'мы добавили круглые скобки вокруг печати, чтобы сделать сценарий python совместимым между python 2.x и python 3.

2 голосов
/ 16 мая 2012

Существует более надежное и удобное решение (проверено на 10.7.4 - не знаю, когда оно стало доступно):

-- Obtain Finder selection and store it in variable "sel".
set sel to selection of application "Finder"
-- Convert to alias, then determine its file URL and store that in variable "myFileUrl"
tell application "System Events" to set myFileUrl to URL of (sel as alias)

Примечание:

  • Только примерработает, если выбор Finder содержит ровно 1 элемент.
  • Элемент tell application "System Events" необходим, поскольку только словарь системных событий содержит тип класса псевдонимов, который имеет свойство URL
  • Длядля краткости, эти два оператора можно объединить в один.

Теперь предположим, что вы хотите создать службу OS X, которая копирует URL-адреса файлов для файлов и / или папок (-й)в данный момент выбрано в Finder в буфер обмена:

  • Запустите Automator, выберите «Файл»> «Новый» и выберите создание новой службы.
  • В разделе «Служба получает выбранные» выберите «файлы» илипапки », а для« in »выберите« Finder.app »
  • Добавить действие« Запустить AppleScript ».
  • Вставьте следующий код AppleScript:
-- Receives the select files/folders from the Finder and copies their file URLs to the clipboard.
-- If the selection comprises more than 1 item, the URLs copied are separated by LF characters.
on run {input, parameters}
    set allUrls to ""
    tell application "System Events"
        repeat with f in input
            -- Convert input file/folder to a "System Events" alias...
            set a to f as alias
            -- and determine the value of the "URL" property, which is the file URL.
            set thisUrl to URL of a
            -- Add the file URL to the overall result.
            if length of allUrls is 0 then
                set allUrls to thisUrl
            else
                set allUrls to allUrls & linefeed & thisUrl
            end if
        end repeat
    end tell
    -- Finally, copy the file URL(s) to the clipboard.
    set the clipboard to allUrls
end run
  • Сохранить новую услугу с описательным именем;например, «Скопировать URL-адреса файлов в буфер обмена»

. Это приведет к появлению новой службы в контекстном меню при щелчке элементов управления в Finder (в зависимости от количества определенных служб, либо наверхний уровень контекстного меню или в подменю «Службы»).

Если вы хотите назначить сочетание клавиш для новой службы, откройте Системные настройки, перейдите в раздел «Клавиатура»> «Сочетания клавиш»> «Службы» и найдите свойнедавно созданный сервис там.Нажмите возле правого края записи и нажмите нужную комбинацию клавиш.

1 голос
/ 16 мая 2012

Хорошо, если вы используете Finder для получения выбора, вам не нужно ("python" или "Системные события"), чтобы получить URL

Потому что вы можете получить URL прямо из Finder

tell application "Finder" to URL of item 1 of (get selection)
set the clipboard to the result
0 голосов
/ 04 мая 2015

Редактор AppleScript превратился в Редактор сценариев , который теперь предоставляет JavaScript для автоматизации (JXA) в дополнение к AppleScript.

Редактор сценариев через инфраструктуру WebKit JavaScriptCore предоставляет encodeURI () и decodeUIR (). EncodeURI () и decodeUIR () значительно упрощают декодирование и кодирование URL-адресов Finder.

Редактор скриптов Try-Me Пример

var appFinder = Application('Finder')

var url = appFinder.insertionLocation().url()
console.log("encoded : " + url)
console.log("decoded : " + decodeURI(url))

var urlList = appFinder.selection();
for (idx in urlList) {
  console.log("encoded : " + urlList[idx].url())
  console.log("decoded : " + decodeURI(urlList[idx].url()))
}

/*  encoded : file:///Volumes/Some%20HD/%E2%80%A2UnicodeName/file.ext */
/*  decoded : file:///Volumes/Some HD/•UnicodeName/file.ext */

ПРИМЕЧАНИЕ. JavaScript для автоматизации (JXA) впервые стал доступен с 10.10 OS X Yosemite.

...