AppleScript:获取对象或类的所有属性的列表

时间:2010-11-21 20:03:50

标签: applescript

为了存储对象的外部(外部AS)访问的值,我需要能够获取该对象的每个属性,然后我会尝试将其强制转换为文本并将其存储在一起。

如何获取对象所包含的属性列表。举个例子,我可以这样写:

tell me
  get properties
end tell

适用于脚本对象。

但对于许多其他对象,我只是得到一个错误,例如“描述符类型不匹配”,就像这里:

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

现在,我知道优秀的脚本调试器可以做到(它可以显示任何对象的整个属性集),因此它也应该可以在AppleScript中编写。这个秘诀是什么?

4 个答案:

答案 0 :(得分:8)

Script Debugger的作者Mark Alldritt非常善意向我解释这个“秘密”。

Script Debugger使用一些特殊的AppleScript API函数(包括OSAGetPropertyNames())来获取此信息。

因此,如果我在例如C中写一个包装器,我也可以这样做。

<强>更新

Cocoa Scripting API有一个专用的类(NSScriptSuiteRegistryNSScriptClassDescription) - 框架通过读取应用程序的脚本定义(.sdef)文件来构建此信息。这样,所有可用的类及其属性都可以很容易地学习。

答案 1 :(得分:4)

脚本调试器 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也无法解决这个问题。

答案 2 :(得分:4)

应用返回&#34;属性的能力&#34;财产一直存在,但在可可之前花了相当多的工作。 Pre-Cocoa,开发人员必须构建一个AEList结构,其中填充了每个属性的键和值,然后在typePropertyList描述符中返回它。许多开发人员都没有打扰。使用Cocoa Scripting,您基本上可以免费获得此项,因为您为类的所有属性使用符合KVC的名称,并且您可以正确配置SDEF文件中的术语和可可键。

BTW,2016年,iTunes 12.3.3,

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

正确返回一长串属性。

答案 3 :(得分:3)

您可以使用一种技巧,因为您可以强制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