2010-11-21 61 views
7

为了存储外部(外部AS)访问的对象值,我需要能够获取该对象的每个属性,然后尝试将其强制转换为文本并将其存储。AppleScript:获取对象或类的所有属性的列表

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

tell me 
    get properties 
end tell 

说了脚本对象的工作。

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

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

现在,我知道的优秀脚本调试器可以做到这一点(它可以显示任何对象的全部属性),所以在书面的AppleScript中也应该是可能的。这个秘密是什么?

回答

6

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

脚本调试器使用一些特殊的AppleScript API函数(包括OSAGetPropertyNames())来获取此信息。因此,如果我在例如C中编写一个包装器,我也可以得到这个。

更新

可可脚本API有这个(NSScriptSuiteRegistryNSScriptClassDescription)专用类 - 框架从读取应用程序的脚本定义(.sdef)文件建立此信息。因此,所有可用的类和它们的属性都可以很容易地学习。

+0

对不起,我想知道你是否有进步,你可以分享,因为我目前的状况和你一样。欢呼 – user14492 2016-03-03 16:23:42

+0

对不起,没有进一步处理此事。 – 2016-03-03 21:11:17

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属性才能获得返回给您的记录(尽管有时这与从对象获取的其他信息不同)。通常情况下,这在大多数情况下在根类-上实施; iTunes不允许这样做。甚至脚本调试器也无法解决这个问题。

+0

Philip,你有Script Debugger吗?因为它*显示所有属性!这是我的问题的重点。 – 2010-11-23 09:02:54

+0

我每天都使用脚本调试器,但是当我使用示例代码时,它没有在对象的返回窗口的返回值区域中显示属性。除非你能够在别的地方找到我不知道的房产价值,否则我很肯定需要有一个“房产”属性,以便一举拿下所有房产的记录。我可以很容易地使用Finder,Adobe InDesign和其他一些应用程序,但不使用iTunes,并且“属性”是差分 – 2010-11-23 10:35:12

+0

我的意思是:当我在SD上的iTunes上“获取文件轨道1”时,它显示我结果的属性,即检索到的轨道的所有成员。我在“结果”抽屉中看到了这一点,“最佳”视图模式和“漂亮打印”。你以前肯定看过这个,不是吗? – 2010-11-24 22:28:22

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 
+1

不错的想法,但它不适用于我上面的测试用例(应用程序“itunes”的文件轨道1),因为错误消息不包括您的代码试图查看的受影响对象的道具。 – 2012-11-27 16:34:07

3

返回一个“属性”的属性的能力,为应用一直存在,但花了相当多的工作预先可可不是之后。Pre-Cocoa开发人员不得不为每个属性构建一个填充了键和值的AEList结构,然后将其返回到一个typePropertyList描述符中。许多开发人员没有打扰。使用Cocoa Scripting,您基本上可以免费获得这个版本。因为您为您的类的所有属性使用KVC兼容的名称,并且您可以正确配置SDEF文件中的术语和可可密钥。

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

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

正确返回特性的一个长长的清单。

+0

由于我一直在研究Cocoa脚本,我发现甚至有两个类可以让我从Sdef文件中查询整个信息,并且它也可以用来读取其他应用程序的sdefs并解析它们。这些类是'NSScriptSuiteRegistry'和'NSScriptClassDescription'。 – 2016-04-04 13:56:47