2010-11-21 60 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