AppleScript の組み込みコマンドの 2 番目のパラメーターがアプリケーション参照である場合、AppleScriptは、最初のパラメーターが別の参照であるかどうかに応じて、アプリケーションまたはコマンドcopy
に "役立つ" 別名を付けます。混乱を避けるために、AppleScript でスクリプト可能なアプリを扱う場合は、 orを明示的に使用することをお勧めします。duplicate
set
duplicate
set
duplicate...
SB に関しては、ヘッダー ファイルでメソッドを探す必要があります。SB のコマンドは、一度に 1 つのオブジェクトしか処理できないため、duplicate
半分機能していないことに注意してください( SB にはいくつかの欠点があります)。ほとんどのアプリケーションでは、1 つのコマンドで複数のオブジェクトを操作できます (スクリプト サポートのバグに注意してください)。たとえば、AppleScript では次のように指定できます。
tell application "iTunes"
duplicate (every track whose artist is "Foo") to (playlist "Bar")
end tell
しかし、SB はそうしません。代わりに、単一の参照のリストを抽出し、それらを繰り返し処理して、一度に 1 つずつ処理する必要があります。コードがかなり長くなり、他の場所に多数のオブジェクトがある場合は非常に非効率になる可能性があります。
別のオプションはobjc-appscript です。これは、これらすべてを正しく実行し、一般的にアプリケーションの互換性の問題が発生する可能性がはるかに低くなります (Matt Neuburg が言うように、「奇妙な互換性」)。さらに、AppleScript コマンドを同等の Python/Ruby/ObjC 構文に変換する ASTranslate を取得します。これは、コマンドを正しく表現する方法を理解するときに非常に便利です。
#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 が最も得意とすること (他のアプリとの通信) には AppleScript を使用でき、それ以外のすべてには ObjC を使用できるようになります。公式ドキュメントは限られていますが、Web 検索でさまざまなサードパーティのリソースが表示されるはずです。MacScripter.net は、開始するのに適した場所かもしれません。ASOC フォーラムに加えて、Craig Williams はしばらく前に一連のチュートリアルを投稿しました。
(ちなみに、Craig は、私が共同執筆した Apress の Learn AppleScript の第 3 版にも ASOC に関する章を寄稿しました。この版には、set
/ duplicate
/の説明を含め、アプリケーション スクリプトの原則と実践に関する多くの情報が含まれていますcopy
。)