AppleScript: получение списка всех свойств объекта или класса

Чтобы сохранить значения объекта для внешнего (вне AS) доступа, мне нужно иметь возможность получить каждое свойство этого объекта, а затем я попытаюсь привести его к тексту и сохранить его где-нибудь.

Как получить список свойств, которые содержит объект. В качестве примера я могу написать это:

tell me
  get properties
end tell

Это работает для объекта сценария.

Но для многих других объектов я просто получаю сообщение об ошибке типа "несоответствие типов дескрипторов", например, здесь:

tell application "iTunes"
  get properties of file track 1
end tell

Теперь я знаю, что превосходный отладчик сценариев может это сделать (он может показать весь набор свойств любого объекта), так что это должно быть возможно и в написанном AppleScript. В чем секрет?

6 ответов

Решение

Марк Олдритт, автор Script Debugger, был так любезен, чтобы объяснить мне "секрет".

Script Debugger использует некоторые специальные функции AppleScript API, включая OSAGetPropertyNames(), чтобы получить эту информацию.

Следовательно, если я напишу оболочку, например, в C, я, вероятно, тоже смогу добраться до этого.

Обновить

В API сценариев Какао есть специальные классы для этого (NSScriptSuiteRegistry а также NSScriptClassDescription) - инфраструктура собирает эту информацию из чтения файла определения сценариев приложения (.sdef). При этом все доступные классы и их свойства могут быть изучены довольно легко.

Script Debugger - это Applescript, просто с кучей инструментов программирования, размещенных вокруг него. Но "несоответствие типов дескрипторов" действительно не должно входить в это. Можете ли вы показать свой код, потому что это прекрасно работает в редакторе скриптов:

tell application "Finder"
    set theFile to choose file
    get properties of theFile -- the "return" keyword also works here as well
end tell

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

Обновление за комментарий и обновленный вопрос: опять же, разные приложения ведут себя по-разному. Приложение на самом деле должно иметь properties свойство, чтобы получить возвращенную вам запись (хотя иногда это отличается от другой информации, которую можно получить от объекта). Как правило, это реализовано в корневом классе -item в большинстве случаев; iTunes не позволяет этого. Даже Script Debugger не может обойти это.

Возможность для приложения возвращать свойство "properties" существовала всегда, но до появления Какао требовалось значительно больше работы, чем после. До появления Cocoa разработчик должен был создать структуру AEList, заполненную ключами и значениями для каждого свойства, а затем вернуть ее в дескрипторе typePropertyList. Многие разработчики не заморачивались. С помощью сценариев Cocoa вы, в основном, получаете это бесплатно, КАК ДОЛГО КАК вы используете KVC-совместимые имена для всех свойств вашего класса И вы правильно настраиваете терминологию и ключи какао в файле SDEF.

Кстати, в 2016 году iTunes 12.3.3,

tell application "iTunes" to get properties of file track 1

правильно возвращает длинный список свойств.

Есть хитрость, которую вы можете использовать, потому что вы можете заставить Applescript сообщать вам об ошибке, и этот текст содержит свойства объекта, который был целью.

set myThing to {FirstName:"Fred", LastName:"Smith"}
ListProperties(myThing)
on ListProperties(MyObject)
try
    get properties of MyObject
on error errText number errNum
    set pStart to offset of "{" in errText
    set structure to text pStart thru ((length of errText) - 2) of errText
    set TIDL to AppleScript's text item delimiters
    set AppleScript's text item delimiters to ","
    set fields to text items of structure as list
    set myMessage to ""
    repeat with f from 1 to count of fields
        set AppleScript's text item delimiters to ":"
        set theseItems to text items of (item f of fields) as list
        set itemPropName to text 2 thru length of item 1 of theseItems
        set itemValue to item 2 of theseItems
        set myMessage to myMessage & "Property Label: " & itemPropName & tab & "Value: " & itemValue & linefeed
    end repeat
    set AppleScript's text item delimiters to TIDL
    display dialog myMessage
end try
end ListProperties

Здесь сказано много слов, но не сказано главного. Почему свойства могут работать для одних объектов, но не работать для других?

Таким образом, независимо от того, доступно ли приложение Cocoa для сценариев или нет, оно реагирует на команды и свойства из Standard Suite. В пакете «Стандарт» свойство свойств является свойством класса «предмет» пакета «Стандарт» и доступно для объектов (предметов) следующих классов:

приложение, запуск атрибута, символ, слово, абзац, цвет, текст, документ, окно

В дополнение к объектам, перечисленным выше, некоторые скриптовые приложения имеют дополнительное свойство свойств , которое является свойством класса «элемент» набора приложений. Наличие этого свойства зависит от конкретного приложения. Например, приложение Music.app, помимо перечисленных выше объектов, позволяет запрашивать свойства следующих объектов:

Устройство Airplay, оформление, кодер, предустановка эквалайзера, список воспроизведения, источник, дорожка, визуальный элемент.

Finder.app имеет дополнительное свойство свойств класса «item» набора элементов Finder + свойство свойств класса «item» набора классов Windows.

То есть ответ такой: можно получить в скрипте свойства тех объектов, которые приложение позволяет в Стандартном и дополнительных пакетах вместе взятых.

https://imgur.com/a/d960OWI
info forявляется «устаревшим», но имеет некоторые полезные свойства, такие какaliasиtype identifier

Другие вопросы по тегам