2010-11-21 7 views
7

Per poter archiviare i valori di un oggetto per l'accesso esterno (esterno AS), devo essere in grado di ottenere tutte le proprietà di tale oggetto, quindi proverei costringerlo al testo e conservarlo in qualche luogo.AppleScript: ottenere un elenco di tutte le proprietà di un oggetto o classe

Come ottenere l'elenco delle proprietà di un oggetto. Per fare un esempio, io posso scrivere questo:

tell me 
    get properties 
end tell 

che funziona per un sceneggiatura oggetto.

Ma per molti altri oggetti, ho semplicemente ottengo un errore come "tipo descripter non corrispondente", come qui:

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

Ora, so che l'eccellente Script Debugger può farlo (può mostrare l'intero insieme di proprietà di qualsiasi oggetto), quindi dovrebbe essere possibile anche in AppleScript scritto. Qual è il segreto per questo?

risposta

6

Mark Alldritt, l'autore di Script Debugger, è stato così gentile da spiegarmi il "segreto".

Script Debugger utilizza alcune funzioni speciali dell'API di AppleScript, tra cui OSAGetPropertyNames(), per ottenere queste informazioni.

Quindi, se scrivo un wrapper, ad esempio, C, probabilmente posso arrivare anche a questo.

Aggiornamento

L'API Cocoa Scripting ha una classi dedicati per questo (NSScriptSuiteRegistry e NSScriptClassDescription) - il quadro costruisce queste informazioni dalla lettura definizione di script di un'applicazione (.sdef) file. Con ciò, tutta la classe disponibile e le loro proprietà possono essere apprese abbastanza facilmente.

+0

Mi dispiace di averlo scoperto, ma mi chiedevo se avessi fatto dei progressi da poter condividere, dato che attualmente sono nella tua situazione simile a te. Cheers – user14492

+0

Siamo spiacenti, non procedere ulteriormente con questo. –

4

Script Debugger è Applescript, solo con una serie di strumenti di programmazione posizionati attorno ad esso. Ma un "disallineamento di tipo descrittore" non dovrebbe davvero entrare in esso. Potete mostrare il codice, perché questo funziona bene in Script Editor:

tell application "Finder" 
    set theFile to choose file 
    get properties of theFile -- the "return" keyword also works here as well 
end tell 

Diverse applicazioni si comporteranno diversa, ma senza codice di esempio, ci sono troppi variazioni da dire definitivamente.

Aggiornamento per commento e domanda aggiornata: Anche in questo caso, le diverse applicazioni si comportano in modo diverso. Un'applicazione deve effettivamente avere una proprietà properties per ottenere un record restituito all'utente (anche se a volte questo è diverso dalle altre informazioni che possono essere acquisite da un oggetto). In genere, questo è implementato nella classe radice item nella maggior parte dei casi; iTunes non lo consente. Neanche Script Debugger può aggirarlo.

+0

Philip, hai Script Debugger? Perché * fa * mostra tutte le proprietà! Questo è il punto centrale della mia domanda. –

+0

Uso Script Debugger tutti i giorni, ma non ha mostrato le proprietà nell'area del valore di ritorno della finestra di ritorno dell'oggetto quando ho usato il codice di esempio. A meno che tu non sia in grado di raggiungere i valori della proprietà da qualche altra parte che non conosco, sono abbastanza sicuro che ci debba essere una proprietà 'properties' per ottenere un record con tutte le proprietà in un colpo solo. Potrei facilmente farlo con il Finder, Adobe InDesign e un paio di altre app ma non con iTunes, e 'properties' era il differenziale –

+0

intendevo: quando faccio" get file track 1 "su iTunes in SD, poi mostra me le proprietà del risultato, cioè tutti i membri della traccia recuperata. Lo vedo nel cassetto Risultati, con la modalità di visualizzazione "Migliore" e "Bella stampa". Lo hai sicuramente visto prima, vero? –

3

C'è un trucco che è possibile utilizzare, perché è possibile forzare Applescript a comunicare l'errore e questo testo include le proprietà dell'oggetto che era il target.

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

Bella idea, ma non funziona per il mio caso di test sopra (file traccia 1 dell'app "itunes") perché il messaggio di errore non include i puntelli oggetto interessati che il tuo codice cerca di esaminare in quel momento. –

3

La possibilità per un app per restituire una "proprietà" proprietà è sempre esistita, ma ci sono voluti più di lavoro notevole pre-cacao che dopo.Pre-Cocoa, lo sviluppatore ha dovuto creare una struttura AEList popolata con chiavi e valori per ogni proprietà, quindi restituirla in un descrittore typePropertyList. Molti sviluppatori non si sono disturbati. Con Cocoa Scripting, in pratica ottieni questo gratuitamente ASTENUTO quando usi i nomi conformi a KVC per tutte le proprietà della tua classe E ottieni la terminologia e le chiavi di cacao nel tuo file SDEF correttamente configurate.

BTW, nel 2016, iTunes 12.3.3,

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

restituisce correttamente un lungo elenco di proprietà.

+0

Dal momento che sto scavando in Cocoa Scripting, ho scoperto che ci sono anche due classi che consentono di interrogare le informazioni complete da un file Sdef ora, e possono anche essere usate per leggere gli sdefs di altre app e analizzarle. Queste classi sono 'NSScriptSuiteRegistry' e' NSScriptClassDescription'. –