为了存储对象的外部(外部AS)访问的值,我需要能够获取该对象的每个属性,然后我会尝试将其强制转换为文本并将其存储在一起。
如何获取对象所包含的属性列表。举个例子,我可以这样写:
tell me
get properties
end tell
适用于脚本对象。
但对于许多其他对象,我只是得到一个错误,例如“描述符类型不匹配”,就像这里:
tell application "iTunes"
get properties of file track 1
end tell
现在,我知道优秀的脚本调试器可以做到(它可以显示任何对象的整个属性集),因此它也应该可以在AppleScript中编写。这个秘诀是什么?
答案 0 :(得分:8)
Script Debugger的作者Mark Alldritt非常善意向我解释这个“秘密”。
Script Debugger使用一些特殊的AppleScript API函数(包括OSAGetPropertyNames())来获取此信息。
因此,如果我在例如C中写一个包装器,我也可以这样做。
<强>更新强>
Cocoa Scripting API有一个专用的类(NSScriptSuiteRegistry
和NSScriptClassDescription
) - 框架通过读取应用程序的脚本定义(.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