当 AppleScript 内置copy
命令的第二个参数是应用程序引用时,AppleScript 会“帮助”应用程序duplicate
或set
命令的别名,具体取决于第一个参数是否是另一个引用。为避免混淆,在 AppleScript 中处理可编写脚本的应用程序时,最好使用duplicate
or明确。set
至于 SB,您需要duplicate...
在头文件中查找方法。请注意,SB 的duplicate
命令是半瘫痪的(SB 有很多缺点),因为它一次只能处理一个对象。大多数应用程序将允许您在单个命令中操作多个对象(警告其脚本支持中的任何错误),例如 AppleScript 会让您说:
tell application "iTunes"
duplicate (every track whose artist is "Foo") to (playlist "Bar")
end tell
但 SB 不会;相反,您必须提取单个引用列表并对其进行迭代,一次处理一个。使您的代码相当冗长,并且如果您在其他地方有大量对象,则效率可能非常低。
另一种选择是objc-appscript,它可以正确地完成所有这些工作,并且通常不太容易出现应用程序兼容性问题(正如 Matt Neuburg 所说的,'quirk-for-quirk compatibility')。另外,您还获得了 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 用于其他所有事情。官方文档是有限的,但是网络搜索应该会抛出各种第三方资源。MacScripter.net 可能是一个不错的起点——除了 ASOC 论坛之外,Craig Williams 不久前还发布了一系列教程。
(顺便说一句,Craig 还为 Apress 的 Learn AppleScript 第三版贡献了一个关于 ASOC 的章节,这是我与人合写的,其中包含有关应用程序脚本编写原则和实践的大量信息,包括对set
/ duplicate
/的澄清copy
。)