【问题标题】:AppleScript: Getting a list of all properties of an object or classAppleScript:获取对象或类的所有属性的列表
【发布时间】:2016-06-18 15:15:18
【问题描述】:

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

如何获取对象所拥有的属性列表。例如,我可以这样写:

tell me
  get properties
end tell

这适用于 脚本 对象。

但对于许多其他对象,我只是收到诸如“描述符类型不匹配”之类的错误,如下所示:

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

现在,我知道优秀的 Script Debugger 可以做到这一点(它可以显示任何对象的整个属性集),所以在编写的 AppleScript 中也应该可以。这有什么秘诀?

【问题讨论】:

    标签: applescript


    【解决方案1】:

    Script Debugger 的作者 Mark Alldritt 非常好心地向我解释了这个“秘密”。

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

    因此,如果我用例如 C 语言编写一个包装器,我可能也可以做到这一点。

    更新

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

    【讨论】:

    • 很抱歉挖掘了这个,但我想知道你是否取得了可以分享的任何进展,因为我目前的情况和你相似。干杯
    • 抱歉,没有进一步处理。
    【解决方案2】:

    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 也无法解决这个问题。

    【讨论】:

    • 菲利普,你有脚本调试器吗?因为它确实显示所有属性!这就是我问题的重点。
    • 我每天都在使用Script Debugger,但是当我使用您的示例代码时,它没有显示对象返回窗口的返回值区域中的属性。除非您能够获得我不知道的其他地方的属性值,否则我很确定需要有一个 properties 属性才能一举获得所有属性的记录。我可以使用 Finder、Adobe InDesign 和其他一些应用程序(但不是 iTunes)轻松做到这一点,而 properties 是差异
    • 我的意思是:当我在 SD 中的 iTunes 上“获取文件轨道 1”时,它会向我显示结果的属性,即检索到的轨道的所有成员。我在结果抽屉中看到了这个,带有“最佳”视图模式和“漂亮打印”。你肯定以前见过这个,不是吗?
    • get file track 1get properties of file track 1 完全是两个不同的命令。现在我看到了,但不是您的原始代码。我没有编写 iTunes 脚本的经验,只有那些使用 properties 属性的应用程序。
    【解决方案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
    

    【讨论】:

    • 好主意,但它不适用于我上面的测试用例(应用程序“itunes”的文件轨道 1),因为错误消息不包含您的代码试图查看的受影响的对象道具那么。
    • 我使用了这个版本的提醒,但请注意日期值有“,”和“:”,所以我必须抓住关键,然后加入分隔符上的剩余值。并且,我通过拆分引号并抓住第二个值来解析出类型,例如 container: list id "..."date "January..."
    【解决方案4】:

    应用程序返回“属性”属性的能力一直存在,但在 Cocoa 之前比在之后需要更多的工作。在 Cocoa 之前,开发人员必须构建一个 AEList 结构,其中填充了每个属性的键和值,然后在 typePropertyList 描述符中返回它。许多开发人员没有打扰。使用 Cocoa Scripting,只要您为类的所有属性使用符合 KVC 的名称,并且正确配置了 SDEF 文件中的术语和 cocoa-keys,您基本上就可以免费获得此功能。

    顺便说一句,2016 年,iTunes 12.3.3,

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

    正确返回一长串属性。

    【讨论】:

    • 自从我一直在研究 Cocoa Scripting 以来,我发现现在甚至有两个类可以让我从 Sdef 文件中查询整个信息,它也可以用来读取 sdef其他应用程序并解析它们。这些类是NSScriptSuiteRegistryNSScriptClassDescription
    • @ThomasTempelmann 你说:“我发现现在甚至有两个类可以让我从一个 Sdef 文件中查询整个信息,它还可以用来读取其他应用程序并解析它们。” 如何使用NSScriptSuiteRegistry 类来读取/解析其他应用程序的 SDEF?
    • @CJK 你看过他们的头文件了吗?比如loadSuiteWithDictionary:fromBundle:
    • @CJK 我在这些对象中看到了数据,但不记得我是如何获得它的。它可能是某个指向这些对象的属性,然后我在那里找到了所有信息。也许把它变成它自己的问题,我可能会查看我的代码并找到一些答案
    • 请记住,NSScriptSuiteRegistry 和 NSScriptClassDescription 只解析 SDEF 的 部分,因此它们报告开发人员 声称 已实现的内容。 SDEF 和实现很容易不同步,因此请谨慎对待。
    猜你喜欢
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多