何時的AppleScript的內置copy
命令的第二個參數是應用參考,AppleScript的「有益」別名到應用duplicate
set
或命令,這取決於第一參數是否是另一參考與否。爲避免混淆,最好在處理AppleScript中的腳本化應用程序時明確使用duplicate
或set
。
至於SB,您需要在頭文件中尋找duplicate...
方法。請注意SB的duplicate
命令是半癱瘓的(SB has quite a few shortcomings),因爲它一次只能處理一個對象。大多數應用程序將允許您在單個命令中操作多個對象(警告其腳本支持中的任何錯誤),例如AppleScript會讓你說:
tell application "iTunes"
duplicate (every track whose artist is "Foo") to (playlist "Bar")
end tell
但SB不會;相反,您必須提取單個引用的列表並對它們進行迭代,逐個處理它們。使代碼變得冗長,如果你在其他地方擁有大量的對象,效率會非常低下。
另一種選擇是objc-appscript,它正確地完成了所有這些工作,並且不太容易出現應用程序兼容性問題(正如Matt Neuburg所說的那樣,「quirk-for-quirk兼容性」)。另外,你ASTranslate,它轉換AppleScript命令,以等效的Python/Ruby的/ ObjC語法 - 非常方便搞清楚時如何撰寫命令正確:
#import "ITGlue/ITGlue.h"
ITApplication *itunes = [ITApplication applicationWithName: @"iTunes"];
ITReference *ref = [[itunes tracks] byTest: [[ITIts artist] equals: @"Foo"]];
ITDuplicateCommand *cmd = [[ref duplicate] to: [[itunes playlists] byName: @"Bar"]];
id result = [cmd send];
另一個選擇,如果你是在10.6,將是使用AppleScriptObjC橋,它允許您在同一個程序中組合使用AS和ObjC,而不需要任何討厭的NSAppleScript廢話。這將允許你使用AppleScript來處理最好的(與其他應用程序通信)和ObjC的其他一切。官方文檔is limited,但網絡搜索應該拋出各種第三方資源。 MacScripter.net可能是一個開始的好地方 - 除了ASOC論壇之外,克雷格·威廉姆斯早些時候發佈了一系列教程。
(順便說一句,克雷格也貢獻了約ASOC到Apress出版的第三版一章學習的AppleScript,我合寫的,並且其中包含大量的信息,應用程序腳本的原則和做法,包括澄清set
/duplicate
/copy
)
來源
2010-07-21 17:33:37
has
感謝您的非常徹底的治療!我目前正在使用Scripting Bridge和ASOC的混合體,看起來好像我可以用這種方法。 – 2010-07-21 20:44:57
我找到了' - duplicateTo:(SBObject *)withProperties:(NSDictionary *)'方法,但是如何構建一個'SBObject *'指定「[container]的結尾」或一些類似的不包含實際對象的插頁式位置? – 2010-07-21 20:58:55
你知道,我其實不知道。 SB開發人員完全有可能忘記添加一種方式來做到這一點,但鑑於文檔糟糕且API不透明且不透明,因此很難說沒有進一步的研究。 (SB是我寫objc-appscript的原因,順便說一句。)你有沒有嘗試過將容器本身的引用傳遞給這個機制? (無論如何,有些應用程序期望容器參考。)如果失敗了,我會建議發佈到applescript-implement,並嘗試引起AS工程師的注意。或者使用基本上Just Works的appscript。 – has 2010-07-21 22:30:13