2010-11-21 48 views
7

Để lưu trữ các giá trị của đối tượng cho truy cập bên ngoài (bên ngoài AS), tôi cần có khả năng nhận mọi thuộc tính của đối tượng đó, và sau đó tôi sẽ thử để ép buộc nó vào văn bản và lưu trữ nó một số.AppleScript: Lấy danh sách tất cả các thuộc tính của một đối tượng hoặc lớp

Làm cách nào để có danh sách thuộc tính mà đối tượng chứa. Ví dụ, tôi có thể viết này:

tell me 
    get properties 
end tell 

đó làm việc cho một kịch bản đối tượng.

Nhưng đối với nhiều đối tượng khác, tôi chỉ đơn giản nhận được một lỗi như "loại descripter không phù hợp", như ở đây:

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

Bây giờ, tôi biết tuyệt vời Script Debugger có thể làm điều đó (nó có thể hiển thị toàn bộ các thuộc tính của đối tượng bất kỳ), vì vậy nó cũng có thể được viết bằng AppleScript. Bí quyết này là gì?

Trả lời

6

Đánh dấu Alldritt, tác giả của Script Debugger, rất tử tế để giải thích "bí mật" đối với tôi.

Trình gỡ lỗi tập lệnh sử dụng một số chức năng API AppleScript đặc biệt, bao gồm OSAGetPropertyNames(), để truy cập thông tin này.

Do đó, nếu tôi viết một trình bao bọc trong, ví dụ, C, tôi có thể có thể nhận được điều này, quá.

Cập nhật

Các Cocoa Scripting API có một lớp học dành riêng cho việc này (NSScriptSuiteRegistryNSScriptClassDescription) - khuôn khổ xây dựng thông tin này từ việc đọc định nghĩa kịch bản của một ứng dụng (.sdef) tập tin. Với điều đó, tất cả các lớp học có sẵn và tài sản của họ có thể được học khá dễ dàng.

+0

Xin lỗi vì đã đào bài này, nhưng tôi đã tự hỏi liệu bạn có thực hiện bất kỳ tiến bộ nào mà bạn có thể chia sẻ hay không, vì tôi hiện đang ở trong tình huống tương tự như bạn. Chúc mừng – user14492

+0

Rất tiếc, không tiến hành thêm điều này. –

4

Trình gỡ lỗi tập lệnh Bản tóm tắt, chỉ với một loạt các công cụ lập trình được đặt xung quanh nó. Nhưng một "loại mô tả không phù hợp" thực sự không nên xâm nhập vào nó. Bạn có thể hiển thị mã của mình không, vì điều này chỉ hoạt động tốt trong Trình chỉnh sửa tập lệnh:

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

Các ứng dụng khác nhau sẽ hoạt động khác, nhưng không có mã ví dụ, có quá nhiều biến thể để nói dứt khoát.

Cập nhật cho mỗi nhận xét và câu hỏi được cập nhật: Một lần nữa, các ứng dụng khác nhau hoạt động khác nhau. Một ứng dụng thực sự phải có một thuộc tính properties để có được một bản ghi được trả lại cho bạn (mặc dù đôi khi điều này khác với các thông tin khác có thể thu được từ một đối tượng). Thông thường, điều này được thực hiện tại một lớp gốc— item trong hầu hết các trường hợp; iTunes không cho phép điều này. Thậm chí không Script Debugger có thể nhận được xung quanh đó.

+0

Philip, bạn có Trình gỡ lỗi tập lệnh không? Bởi vì nó * không * hiển thị tất cả các thuộc tính! Đó là toàn bộ vấn đề của câu hỏi của tôi. –

+0

Tôi sử dụng Trình gỡ lỗi tập lệnh mỗi ngày, nhưng nó không hiển thị các thuộc tính trong vùng giá trị trả về của cửa sổ trả về của đối tượng khi tôi sử dụng mã ví dụ của bạn. Trừ khi bạn có thể nhận được các giá trị tài sản ở một nơi khác mà tôi không biết về, tôi khá chắc chắn có cần phải là một tài sản 'tài sản' để có được một kỷ lục với tất cả các tài sản trong một ngã swoop. Tôi có thể dễ dàng làm điều đó với Finder, Adobe InDesign và một vài ứng dụng khác nhưng không phải iTunes và 'properties' là vi sai –

+0

Tôi muốn nói: Khi tôi thực hiện" theo dõi tệp 1 "trên iTunes trong SD, thì nó hiển thị tôi là thuộc tính của kết quả, tức là tất cả các thành viên của bài hát đã truy xuất. Tôi thấy điều này trong ngăn kéo Kết quả, với chế độ xem "Tốt nhất" và "In đẹp". Bạn chắc chắn đã thấy điều này trước đây, phải không? –

3

Có một mẹo bạn có thể sử dụng, bởi vì bạn có thể bắt buộc bản ghi phải cho bạn biết lỗi và văn bản này bao gồm các thuộc tính của đối tượng là mục tiêu.

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

Ý tưởng hay, nhưng nó không hoạt động đối với trường hợp thử nghiệm ở trên của tôi (theo dõi tệp 1 của ứng dụng "itunes") vì thông báo lỗi không bao gồm đạo cụ đối tượng bị ảnh hưởng mà mã của bạn tìm kiếm để xem xét sau đó. –

3

Khả năng ứng dụng trả về thuộc tính "bất động sản" luôn tồn tại, nhưng phải mất nhiều công việc trước ca cao hơn sau.Pre-Cocoa, nhà phát triển phải xây dựng một cấu trúc AEList được điền bằng các khóa và giá trị cho mỗi thuộc tính, sau đó trả về nó trong một bộ mô tả typePropertyList. Nhiều nhà phát triển không bận tâm. Với Cocoa Scripting, về cơ bản bạn có thể sử dụng AS LONG AS miễn phí khi bạn sử dụng các tên tuân thủ KVC cho tất cả các thuộc tính của lớp và bạn nhận được thuật ngữ và khóa cacao trong tệp SDEF của bạn được cấu hình đúng.

BTW, vào năm 2016, iTunes 12.3.3,

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

trả về đúng một danh sách dài các tài sản.

+0

Vì tôi đã đào sâu vào Cocoa Scripting, tôi đã tìm thấy thậm chí có hai lớp cho phép tôi truy vấn toàn bộ thông tin từ một tệp Sdef ngay bây giờ và nó cũng có thể được sử dụng để đọc các sdef của các ứng dụng khác và phân tích chúng. Các lớp đó là 'NSScriptSuiteRegistry' và' NSScriptClassDescription'. –

Các vấn đề liên quan