Applescript: язык автоматизации для macOS


AppleScript — скриптовый язык, который используется для управления системой, приложениями и файлами в Mac OS X. Наиболее общий принцип применения следующий: открыть приложение и передать ему набор инструкций для выполнения. Причем это не обязательно приложения из стандартного комплекта поставки операционки, многие сторонние приложения также предоставляют API для обращения к ним через AppleScript.

Для редактирования и запуска скриптов есть небольшой редактор, который находится в Application > Utilites > AppleScript Edtior. Редактор довольно минималистичный и не имеет богатых возможностей, но для написания небольших скриптов его обычно оказывается вполне достаточно. Условно его можно разделить на две части: в первой пишется непосредственно сам код, а в нижней части, показывается результат выполнения твоих трудов. Если вдруг возникнет необходимость сделать более или менее серьезный проект, то удобнее будет воспользоваться какой-нибудь сторонней разработкой, например Script Debugger.

Азы

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

Чтобы задать переменную нужно воспользоваться оператором set. Делается это так:

set <имя переменной> to <значение>

Имя переменной не должно совпадать с зарезервированными словами (beep, say и т.д.), а также нельзя начинать имя переменной с цифры.

Условия задаются при помощи оператора if, как и в других языках:

set a to true
if a is true then
     say "That's true"
else
     say "That's false"
end if

Оператор say произносит переданный ему текст. Вместо «is» можно писать привычный знак равенства.

Задать цикл можно оператором repeat. В самом простом случае достаточно написать:

repeat 2 times
     beep
end repeat

Этот цикл 2 раза воспроизведет стандартный системный звук. Если нужны итерационные циклы, то их можно задать используя until или while, например:

set i to 1
repeat until i is 10
     beep
     set i to i + 1
end repeat

Арифметический цикл можно задать при помощи with таким образом:

repeat with i from 1 to 20 by 2
     say i
end repeat

Я думаю, понятно, что этот код будет произносить числа от 1 до 20 с шагом 2. Сейчас я быстро прошелся по основным «школьным» азам, чтобы было понятно что это за язык и с чем его едят. Как видишь, разработчики старались делать его таким, чтобы пользователи с разным уровнем подготовки могли «говорить» с компьютером практически человеческим языком. Я не буду подробно останавливаться на всех особенностях синтаксиса, если возникнут вопросы, ты всегда сможешь найти ответы в документации на сайте Apple.

Диалоги с пользователем

AppleScript не был бы так интересен, если бы не возможность легко создавать различные диалоговые окна, что дает нам возможность сделать наши скрипты более user-friendly.

Давай начнем с вызова стандартного системного диалога выбора файла. Делается это при помощи команды choose file.

set filePath to choose file of type {"PDF", "MOBI"} with multiple selections allowed

В данном примере, будет вызван диалог выбора файла в котором включена фильтрация по типу (pdf или mobi) и разрешен выбор нескольких файлов. Если ты выполнишь этот код, то заметишь, что путь к файлу запишется, как alias:

System:Users:UserName:file.pdf   

Такой формат понимают стандартные приложения в Mac OS, но часто требуется использовать привычный нам POSIX-вид, делается это легко:

set posixFilePath to POSIX path of filePath

В переменную posixFilePath путь запишется в виде: /Users/UserName/file.pdf.

Аналогичным способом выбирается папка при помощи choose folder. Чтобы показать свое, кастомное сообщение пользователю, нужно воспользоваться командой:

display dialog "Твое сообщение" with title "Заголовок"

Если не было передано никаких параметров, то будет выведен стандартный диалог с кнопками «ОК» и «Cancel». Тут стоит отметить, что после вывода диалога скрипт приостановит выполнение, и продолжит выполняться после нажатия «ОК», а вот после «Cancel» выполнение скрипта будет прервано с соответствующей ошибкой «User canceled.». Если такое поведение в твои планы не входит, то самое простое, — воспользоваться обработчиком ошибок:

try
     display dialog "Нажми Cancel"
on error
     display dialog "Ты нажал Cancel :)"
end try

Естественно, может такое случиться, что потребуются другие кнопки, кроме «Cancel» и «OK», и ты конечно же волен добавить любые, которые захочешь (но не больше трех). Делается это следующим образом:

display dialog "Are you sure?" buttons {"Don't know", "Not sure", "Maybe"}

А как быть, если требуется дать пользователю выбрать что-нибудь из списка? Легко:

choose from list {"1", "2", "3"} with title "Choose it!" with prompt "Choose somethng:"

В случае если нужно будет просто ввести какие-либо данные воспользуйся такой строчкой:

display dialog "What is your name?" default answer "

Диалоги с софтом

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

tell application "Имя приложения"
     -- Действия
end tell

Например, очистим корзину:

tell application "Finder"
     empty trash
end tell

Чтобы узнать какие действия доступны для того или иного приложения, в AppleScript имеется средство, которое называется Dictionary, оно доступно в меню File > Open dictionary.

Также имеется возможность передачи команд на удаленный компьютер. Для начала, нужно включить опцию Remote Apple Events на машине, где требуется выполнить какие-либо действия в System Preferences > Sharing. Теперь, чтобы выполнить код на другой машине, нужно использовать следующую конструкцию:

tell application "Имя приложения" of machine "epic://ip-адрес"

Будь готов, что для выполнения действия на удаленной машине скрипт запросит логин и пароль, так что если ты потираешь руки, чтобы творить беспредел, придется придумать что-то еще :).

Командная строка

После прочтения предыдущих двух разделов у тебя наверняка должна была зародиться мысль о том, что неплохо было бы соединить удобство AppleScript с мощью shell-скриптов. Первое, что приходит в голову, — воспользоваться знаниями из предыдущего раздела и скормить необходимые команды приложению Terminal.

tell application "Terminal"
     do script "ping -c 1 ya.ru"
end tell

Такой способ имеет право на существование и в отдельных случаях он может быть даже предпочтительнее, но есть другой вариант: воспользоваться командой do shell script, при помощи которой можно также выполнять консольные команды, что гораздо более удобно, так как дает возможность записать результат выполнения команды в переменную и оперировать с ней дальше средствами AppleScript.