Що таке applescript - it в школі
Ви ще не використовуєте AppleScript? Не знаєте, що це таке? Чи вважаєте, ніби Вам це ні до чого? Або, можливо, пам'ять про шкільні уроки інформатики викликає у Вас напад алергії при одному згадуванні слова «програма»? Значить, Ви правильно зробили, відкривши цю статтю.
Сподіваюся, вона допоможе розібратися з цим вельми корисним інструментом, і час, витрачений на читання, потім окупиться сторицею.
Що таке AppleScript
Нерідко при роботі з тією чи іншою програмою нам доводиться по кілька разів виконувати однакові дії: натискати на одні і ті ж клавіші, вибирати одну і ту ж команду з меню, вводити одні і ті ж значення в діалогових вікнах Ось тут-то на допомогу і приходить AppleScript. Описуємо послідовність наших операцій у вигляді програми-«скрипта», запускаємо і - спокійно п'ємо каву, зрідка поглядаючи, не закінчилася чи обробка останнього три тисячі сімсот вісімдесят дев'ятого файлу. Щось подібне існує в вигляді BAT-файлів DOS або скриптів для оболонок (shell) UNIX. Але у AppleScript є важлива перевага: ця мова «розуміють» як Finder, так і велике число прикладних програм, і скрипт може звертатися по черзі до них всім.
Мова, якою ми будемо користуватися (він теж називається AppleScript), дуже близький до звичайного англійської мови. Наприклад, скрипт може виглядати ось так:
Думаю, все зрозуміли, що він зробить. Але щоб навчитися писати свої власні скрипти, доведеться розібратися з деякими поняттями.
Об'єкти, властивості, події ...
Однотипні об'єкти (наприклад, всі папки) утворюють клас (class). Кожен об'єкт має деяким набором властивостей (properties), який вирізняє його від іншого. Наприклад, у кожного файлу є ім'я, мітка, тип, дата створення, версія і ще більше десятка характеристик. Частина з них скрипт може змінювати, деякі - тільки прочитати.
Один клас (так званий «нащадок») може успадковувати властивості іншого класу ( «предка»). Наприклад, і у папок, і у файлів є загальний предок - елемент (item).
Тепер розглянемо наш приклад, трохи доповнивши його:
Ми спершу наказуємо програмі Finder створити новий об'єкт класу «папка», розташований на Столі. Частина властивостей задано в команді (ім'я папки і її кольорова мітка), інші будуть призначені комп'ютером за замовчуванням. Потім говоримо Finder'у, щоб він скомандував своїй папці (так і тільки так: «васал мого васала - не мій васал») відкритися і змінити ім'я.
Але пора б від теоретичних міркувань перейти до чогось більш відчутного. Саме час запустити Script Editor.

Словники, словники, словники ...
Програми Макінтоша можуть підтримувати AppleScript на трьох різних рівнях.
Scriptable - програма може виконувати команди, описані у вигляді скрипта.
Recordable - можливий запис команд, які виконуються в програмі. Створимо новий скрипт, запускаємо запис (кнопкою «Record»), виконуємо, наприклад, в Finder вручну необхідні дії, зупиняємо запис ( «Stop»). От і все. Таким чином дуже зручно робити заготовки скриптів.
Attachable - скрипт може виконуватися безпосередньо з програми, будучи «приєднаним» до меню або будь-якого об'єкта у вікні. Приклади таких програм: AppleWorks, Tex-Edit, FileMaker Pro.
Відкриємо, наприклад, словник програми Finder.

Зліва Ви бачите список всіх визначених у програмі «термінів». Зверніть увагу: частина з них набрана курсивом. Це - об'єкти. Все решта - команди. Клацнувши на потрібне слово, можна прочитати коротку довідку.
Читаємо далі. «Plural form: containers». Форма множини? Ми хіба граматику англійської мови вивчаємо? І так і ні. Я адже вже згадував, що AppleScript максимально наближений до природної мови. І якщо ми хочемо обробити всі об'єкти даного класу, то записати це, як і годиться в англійській мові, можна або «every container», або «containers».

Як Ви вже знаєте, об'єкт може містити в собі інші об'єкти. Які саме і чим відрізняються один від одного, описано в наступному розділі словника - «Елементи» (Elements). Контейнер, як бачите, може містити об'єкти півтора десятка різних класів, наприклад, інші контейнери, папки, файли документів і програм і т. Д. А вказати конкретний елемент будь-якого класу можна або ім'ям (by name), або порядковим номером (by numeric index).

Ну, і нарешті, останній розділ - «Властивості» (Properties). Тут ми, по-перше, бачимо, що клас «Контейнер» - спадкоємець класу «Елемент» (
Ну ось. Ви вже можете спробувати написати якийсь простий скрипт. Отже ...
О, творець!
Думаю, Ви знаєте, що кожен файл на Макінтош володіє двома ознаками - типом і кодом творця, що дозволяють Finder'у вирішити, як з цим файлом звертатися. Не секрет і те, що нерідко - наприклад, після передачі через Інтернет - ці атрибути губляться. Звичайно, є чимало програм, які вміють їх змінювати. Але давайте спробуємо зробити свою власну утиліту, користуючись тільки тим, що вже закладено в Mac OS.
Почнемо з найпростішого варіанту. Нехай нам потрібно призначити файлу letter.txt, що знаходиться на Столі, призначити тип «TEXT» і код творця «ttxt» (ПростоТекст).
Вибираємо в словнику програми Finder об'єкт file. Знаходимо потрібні нам властивості: file type і creator type. Для зміни значення тієї чи іншої властивості використовується команда «setraquo; (Встановити). Стало бути весь скрипт повинен виглядати приблизно так:
Таким чином, як бачите, можна або наказати файлу поміняти свої (its) властивості (в даному прикладі слово «its» можна опустити, т. К. Призначення команди однозначно визначено і без нього), або - програмі Finder поміняти властивості підлеглого об'єкта.
Я не даремно поставив умову, що файл знаходиться на робочому столі. В іншому випадку нам потрібна була довша «ланцюжок» підлеглих об'єктів (щось на зразок «tell application« Finder »to tell disk« Macintosh HD »to tell folder« lesson »to tell file« letter.txt »»). Або ж - для другого варіанту скрипта - вказівка повного шляху. «File« Macintosh HD: lesson: letter.txt »» (Нагадаю: шлях в Mac OS записується через двокрапки).
Що ж, скрипт написаний. Він працює. але користі від нього, прямо скажемо, ніякої - адже для кожного наступного файлу потрібно змінювати текст самого скрипта. Нічого собі, спростили роботу! Треба б нашу програму вдосконалити. Навчимо її питати користувача, який файл обробляти. Відкриваємо словник Finder'а, дивимося Ось тобі й маєш! Нічого підходящого. Невже Apple допустила таку похибку? Зовсім ні…
«А у Вас немає такого ж, але з перламутровими ґудзиками?»
Відкрита архітектура скриптів (OSA - Open Script Architecture) дозволяє обзавестися практично будь-яким необхідним елементом мови. Звичайно, якщо хтось подбав написати «додаток» (Scripting Addition або OSAX), яке описує такий об'єкт і відповідні команди. Розміщуються ці доповнення в папці Scripting Additions, що знаходиться в System Folder (раніше - в Extensions). Використовувати ж їх може будь-який скрипт, незалежно від того, якою програмою він в даний момент командує.
Наш скрипт прийме ось такий вигляд:
Цілком працездатна програма. Але чи не можна зробити її більш зручною? Навіщо окремо запускати скрипт, потім вибирати в діалозі ім'я файлу - не краще використовувати метод Drag'n'Drop? Все в наших силах!
пишемо Droplet
Отже, що ми хочемо отримати, і як цього домогтися.
У найпростішому випадку він буде виглядати ось так:
on open FileList - словом «on» починається обробник події
- спершу скрипт працює сам, не зачіпаючи ніяких програм
set MyFile to item 1 of FileList
tell application «Finder» - тепер командуємо Finder'ом
set file type of MyFile to «TEXT»
set creator type of MyFile to «ttxt»
end tell
end open - не забуваємо вказати, що обробник закінчився
Для тимчасового зберігання списку ми використовували змінну FileList. Називати змінні можна будь-якими поєднаннями латинських букв, але бажано так, щоб по імені можна було зрозуміти, що ж ця змінна позначає.
Як бачите, обробляється перший елемент з переданого при запуску скрипта списку. А решта? На них наша програма просто не звертає уваги. Не важко здогадатися, що наступним кроком по шляху до досконалості буде обробка відразу цілої купи файлів.
Раз, раз, ще раз ...
До сих пір всі команди наших скриптів виконувалися по черзі в тому порядку, як записані. Тепер же нам потрібно повторити одні й ті ж дії кілька разів поспіль. Доведеться організувати особливу структуру - цикл. У AppleScript є для цього різноманітні керуючі команди. Можна повторити дії наперед заданий число раз, або виконувати їх поки дотримується деякий умова. Але такими циклами має практично будь-яку мову програмування. У нашій же завданню ідеально підійде інший - "повторити для кожного елемента списку». З ним скрипт прийме наступний вигляд:
Чого ще не вистачає нашій програмі, щоб стати цілком професійної? А не вистачає їй «захисту від дурня». Адже «кинути» на картинку скрипта можна і папки, і ярлики, а працювати він повинен тільки зі звичайними файлами.
Кого хочеш, вибирай
Стало бути, перебираючи елементи списку, потрібно визначати, чим кожен з них є. Тільки якщо попався звичайний файл - міняти його властивості. Вибрати, робити або не робити будь-які операції, дозволяє ще одна керуюча конструкція - умовний оператор If. Визначити, чи не є об'єкт папкою або ярликом, можна, отримавши інформацію про нього командою «info for» з Standard Additions. Результатом її буде об'єкт класу «file information». Ось його-то властивості - «папка?» (Folder) і «ярлик?» (Alias) - ми і будемо перевіряти. Оскільки нам необхідно, щоб елемент не був папкою І не був ярликом, дві умови зв'яжемо логічною операцією «and» (коли достатньо виконання якого-небудь одного з умов - АБО першого, АБО другого - користуються зв'язкою «or»). Загалом, в результаті наших міркувань вийшов ось такий скрипт:
Не забуваємо, що зберегти його потрібно як додаток (application). Ну от і все. Наша перша програма готова.
Зверніть увагу, що всі умови в операторі If повинні бути записані в один рядок. Щоб зробити текст програми більш зручним для читання, буває корисно «скласти» довгий рядок, як зроблено в цьому прикладі. Для цього потрібно натиснути комбінацію клавіш «Option-Return». У тексті з'явиться символ продовження - «¬».