AppleScript для абсолютных новичков

Дата публикации:18.07.2012
Twitter Facebook Vkontakte

Глава 12. Пути к файлам, папкам и приложениям

Давайте посмотрим как организованы папки и файлы на вашем жестком диске. Если вы откроете окно Finder в виде колонок, оно будет выглядеть примерно так:

<...>

Тут жесткий диск, который содержит папки, приложения и файлы (на рисунке выше файлы и приложения не показаны). Все эти элементы организованы в виде иерархической структуры. Это позволяет нам определять размещение файла (или папки, или приложения) через путь. Давайте посмотрим как такой путь выглядит [1].

choose folder [1]

Вот что поле результата покажет, если я выберу мою папку Documents: "alias "5un5hine:Users:ik:Document5:"

Вы можете видеть путь, который в основном пишется так:

hard disk name:folder name:subfolder name:subfolder name:
(имя жесткого диска:имя папки:имя подпапки:имя подпапки:)

Проследите этот путь на картинке выше (снимок окна Finder) до папки "Documents". Затем, переведите свое внимание на картинку с полем Result. Обратите внимание, что в путях символ двоеточия используется как разделители. Вот почему символ двоеточия не допустим в именах файлов и папок. Попробуйте создать на рабочем столе новую папку и дать ей имя содержащее двоеточие. Наконец, вы можете увидеть, как путь оканчивается двоеточием, которое показывает, что путь относиться к папке.

Используем путь, чтобы приказать Finder'у открыть папку [2].

tell application "Finder"
open folder "Macintosh HD:users:ik:Documents"	[2]
end tell

Как вы сможете увидеть, когда запустите сценарий [2] (не забудьте заменить "ik" на ваш собственное имя в системе), AppleScript будет весьма снисходителен, и не важно укажите ли вы двоеточие в конце пути или нет. Однако, пожалуйста, обратите внимание, что имя жесткого диска должно быть написано строго с учетом регистра. Ай-ай-ай, Apple!

Моя папка "Documents" содержит файл AppleWorks под именем "report". Давайте откроем этот файл [3].

tell application "Finder"
open file "Macintosh HD:users:ik:Documents:report.cwk"	[3]
end tell

Первое замечание к этому оператору [3.2], он определяет файл ("file"), не папку ("folder"), потому что мы обращаемся к файлу. Второе замечание, в конце имени пути в имени файла должно быть определено расширение файла. Здесь расширение "cwk", производное от оригинального имени AppleWorks, которое раньше было ClarisWorks.

В Mac OS X расширение файла скрыто по умолчанию. Вы можете найти расширение, выбрав файл и нажав Command-i, чтобы увидеть паспорт этого файла.

Вместо этого, вы можете предпочесть, чтобы расширения файлов были видимыми всегда. Чтобы это сделать, установите соответствующие параметры Finder. Выберите элемент меню "Finder" программы "Finder". В появившемся меню выберите "Preferences" (Параметры).

В окне, которое появится, выберите раздел "Advanced" (Дополнительно) поставьте галочку в чек-боксе "Show all file extensions" (Показывать расширения всех файлов).

Если вы хотите сохранить путь к файлу "report.cwk" в переменной, вы можете сделать это так [4]

tell application "Finder"
set thePath to file "Macintosh HD:Users:ik:Documents:report.cwk"  [4]
end tell

Однако, если запустить данный сценарий, результат не будет в таком же формате как вы видели выше. Теперь, он будет выглядеть так:

"document file "report.cwk" of folder "Documents" of folder "ik" of folder "Users" of startup disk of application "Finder"

Такой стиль немного сложнее для чтения, особенно с длинными путями, и хуже всего то, что этот формат распознает только Finder. Вам может больше понравиться, или даже понадобиться, более абстрактное представление пути, использующее двоеточия. Чтобы заставить Finder вернуть его в таком виде, используйте команду "a reference to" (дать ссылку на) [5].

tell  application "Finder"
set thePath to a reference to file "Macintosh HD:Users:ik:Documents:report.cwk"        [5]
end tell

file "Macintosh HD:Users:ik:Documents:reporLcwk" of application "Finder"

Обратите внимание, поле результата говорит, что мы имеем (файл). Пожалуйста, запустите сценарий [6] и выберите тот же файл report.cwk.

choose file [6]

Теперь результат будет выглядеть вот так: "alias "Macintosh HD:Users:ik:Documents: report.cwk"

Оно содержит "alias", вместо "file"! Чтобы объяснить различие в AppleScript, давайте сначала обсудим, что такое псевдоним (alias), к которому вы уже привыкли в работе с Finder.

Предположим, что я создал псевдоним на моем рабочем столе на файл "report.cwk", который находится в моей папке "Documents". Если я перемещу файл "report.cwk" из папки "Documents" в другое место, двойной щелчок по псевдониму будет всё так же открывать этот файл. Замечательно! Я могу даже переименовать исходный файл "report.cwk" во что-нибудь другое, например в "funny_story.cwk". Это потому что псевдоним не хранит информацию о размещении (и имени) файла "report.cwk", такую как:

"Macintosh HD:users:Documents:report.cwk"

а хранит особый вид идентификатора. Finder обслуживает базу данных этих идентификаторов вместе с текущим месторасположением соответствующих файлов (а также папок, и приложений). Так что, если я перемещу файл "report.cwk", его уникальный идентификатор остается тем же, но Finder внесет изменения во внутреннюю базу данных, отражающие новое местоположение файла. Когда я дважды щелкаю на псевдониме, содержащийся в нем идентификатор используется Finder'ом для поиска файла, соответствующего этому идентификатору, и после Finder открывает нужный файл.

Чтобы создать сценарий, который не прервется в случае, если файл (или папка), на который файл ссылается, был удален или переименован, наш сценарий должен содержать идентификатор (ID) файла (или папки), вместо "жестко-заданного" пути. AppleScript позволяет это сделать [7].

set thePath to alias "Macintosh HD:Users:ik:Documents:report.cwk" [7]

Очень важное замечание по сценарию [7], который ссылается на оригинальный файл, находящийся в папке "Documents", а не на какой-нибудь созданный пользователем псевдоним этого файла, подобный тому, что я предполагал создать на моем рабочем столе. В операторе сценария [7] ключевое слово "alias" показывающее что, после компиляции (т.е. проверка синтаксиса), сценарий запомнит идентификатор файла и, во время исполнения, не будет спрашивать Finder о файле, указанным с помощью пути, а будет основываться на идентификаторе.

Если вы запустите сценарий [7] и проверите результат в поле результата, то увидите следующее:

alias "Macintosh HD:Users:ik:Documents: re port, сwk"

Вы не увидите сам идентификатор. Однако, слово "alias" впереди пути подскажет вам, что сценарий внутри себя работает с идентификатором, а не с "жестко-заданным" путем. Теперь, когда сценарий был скомпилирован, переместите файл "report.cwk" в другое место и запустите сценарий еще раз. Я перенес файл в папку "Miscellaneous" внутри моей папки "Documents". Даже если сам сценарий, и в особенности путь в сценарии [7], не изменяли, результат будет таким

alias "Macintosh HD:Users:ik:Documents:Miscellaneous:report.cwk"

Попытайтесь самостоятельно (еще раз повторю, ваш путь будет выглядеть по другому, потому что ваш логин скорее всего не ik и возможно потому что вы используете другие имена папок)! Если вы сохраните сценарий как скомпилированный сценарий (compiled script) или как программу (AppleScript application), идентификатор сохранится, и в следующий раз, когда вы запустите сценарий, он будет выполнен безупречно даже если вы переместили или переименовали исходный файл. Пусть для вас не будет сюрпризом то, что в сценарии произойдет сбой, если файл удалить.

Подведем итоги. У вас есть два способа, чтобы обращаться с путями в сценарии. Вы можете либо указывать местонахождение файла (жестко задавать, используя file "path here"), либо использовать ключевое слово "alias", чтобы сделать сценарий нечувствительным к перемещениям и переименованиям файла/папки/приложения после компиляции сценария.

Не смотря на то, что часто используется способ с "alias", во время компиляции сценария файл, на который вы ссылаетесь, должен быть там, где вы указали. А также, вы не сможете передать сценарий кому-нибудь еще в виде приложения AppleScript, потому что даже если файл с таким же именем присутствует в аналогичном месте на компьютере этого человека, файл все-равно будет иметь другой идентификатор.

Примечание по сценарию [7]. Лично я был приятно удивлен тем, что всё это работает без блока обращения Finder. Все-таки внутренняя база данных хранящая идентификаторы и местоположения файлов управляется приложением Finder. Потому что только Finder может предоставить нам такую информацию, и AppleScript (компонент MacOS X) знает это, AppleScript по-видимому спрашивает Finder об идентификаторе закулисно или обращается к базе данных напрямую. Это поведение все-таки исключение. Например, открытие файла с использованием пути требует блока обращения (см. сценарий [3]). Это потому что не только Finder может открыть некоторый файл, но также программа, которая этот файл создала, и возможно другая программа тоже. Например, изображение в формате JPEG, может быть открыто программами PhotoShop, Preview и Safary. Блок обращения необходим для точного указания программы, которой будет открываться файл.

Теперь, когда мы знаем как адресовать файлы и папки, мы можем перемещать их всюду или копировать их [8].

tell application "Finder"
move file "Macintosh HD:Users:ik:Documents:report.cwk" to the trash	[8]
end tell

Дополнительная информация

  1. Полный вариант книги (rtf/7z)-- электронная книга с сохранением иллюстраций, форматирования, изменений в цвете шрифта.


Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения.
Идея и реализация: © Владимир Довыденков и Анатолий Камынин,  2004-2019