В маке есть отличная штука для автоматизации, упрощения и расширения возможностей ОС. Штука эта называется Automator.
Итак... Once time upon...
Была сессия и надо было сконвертировать и переименовать огромное количество грфических файлов шпор... Рутиная монотонная работа... Как раз для Автоматора! =)
Запускаем автоматор. Он предлагает нам следующие варианты:
*.app
.Я хотел сделать так: выделяешь файлы в папке, жмешь переименовать, указываешь шаблон и вперед! Для реализации задумки нам нужно будет сделать службу.
Выбираем Службу.
Службу можно сделать как межпрограммную, так и только для программы Finder, например.
Реализуется это очень просто:
выбираем "Заменить текст в именах объектов Finder"
Вот и все! Но! пока я писал этот пост, у меня в голове всплыла давняя мысль реализовать возможность открытия папки в Терминале из Finder.
Для решения этой задачи нам нужно будет написать службу Finder.
Итак! Создаем новую службу.
Нужно узнать путь к выбранной папке и сохранить его в переменную...
Выбранную папку нам предоставит сама служба. А в сохранении пути к ней нам поможет "Установить значение переменной".
Теперь нужно собственно запустить Терминал и попросить его перейти в нужную нам директорию.
Вот тут-то и начинается веселье. Запустить терминал можно несколькими способами.
То есть, можно просто "Запустить программу", можно "Запустить процесс" или даже Shell-скрипт вида /bin/bash :)
Но нам требуется не просто запустить Терминал, а еще заставить его перейти в конкретную папку...
Я долго пытался реализовать это стандартными путями вида "Запустить программу", "Запустить shell-скрипт"... Но что-то у меня ничего не вышло.
Оставалось только "Запустить AppleScript"... Я давно хотел разобраться с этим зверем, поэтому как раз решил совместить приятное с полезным.
Идея проста: запустить терминал и попросить его перейти в нужную папку.
Вопрос первый: как запустить Терминал?
Ответ:
tell application "Terminal" activate end tell
Вопрос второй: как заставить его что-нибудь сделать?
Ответ на этот вопрос я нашел такой: ( если кто знает лучше - пишите! )
tell application "Terminal" activate do script "echo test" end tell
Итак, запускать и управлять терминалом мы умеем. Теперь это все надо объяснить.
Видим, что есть некий аргумент input. Очевидно,что в нем будет содержаться то, что вернет предыдущий модуль. А это в свою очередь путь к папке.
Но! не так-то все просто! Путь к папке получается в виде: Macintosh HD:Users:user:Desktop:
А реальный путь, приемленый для Терминала это /Volumes/Macintosh HD/Users/user/Desktop/
Значит нам надо:
- заменить все : на / ;
- добавить в начало /Volumes/ ;
- заэкранировать пробелы.
Вот ту еще один сюрприз: у крутого AppleScript нет функции вида str_replace() ))))
Но есть костыль:
on replaceText(find, replace, subject) set prevTIDs to text item delimiters of AppleScript set text item delimiters of AppleScript to find set subject to text items of subject set text item delimiters of AppleScript to replace set subject to "" & subject set text item delimiters of AppleScript to prevTIDs return subject end replaceText
Достаточно оригинальный и красивый способ! Мне понравился! =)
Итак, все вместе:
on run {input, parameters}
(* Add /Volumes/ for creating absolutely posix path *)
set input to "/Volumes/" & input as string
set input to get replaceText(":", "/", input as string)
set input to get replaceText(" ", "\\ ", input as string)
tell application "Terminal"
activate
do script "cd " & input as string
end tell
end run
on replaceText(find, replace, subject)
set prevTIDs to text item delimiters of AppleScript
set text item delimiters of AppleScript to find
set subject to text items of subject
set text item delimiters of AppleScript to replace
set subject to "" & subject
set text item delimiters of AppleScript to prevTIDs
return subject
end replaceText
Теперь у меня в Finder есть такая штука:
That's all Folks! ;)
Хочу сказать, что какого-либо хорошего пособия по AppleScript и Automatorя не видел. Печально. Если у кого есть что, то дайте знать!
Комментариев нет:
Отправить комментарий