AppleScript:在 "Expected end of line, etc. but found identifier." 中出现 "use framework" 个错误

AppleScript: "use framework" errors out in "Expected end of line, etc. but found identifier."

我有以下一段 AppleScript。

use framework "Foundation"
display dialog "foo"

注意:Foundation框架在这个例子中并没有实际使用,因为那部分代码与这个例子无关。仅此代码就已经产生了错误。在现实生活中,我们显然只导入一个框架来使用它,duh :-)

当我 运行 这个时,我得到了无用的错误:

Expected end of line, etc. but found identifier. 

macOS 脚本编辑器停止的标识符是 "dialog"。

当我将代码更改为:

display dialog "foo"

脚本 运行如我所料。

我有两个问题:

  1. 为什么上面的例子会产生错误?
  2. 为什么会产生这个确切的错误?或者换句话说:为什么这个错误如此无益?一般来说,AppleScript 是这样吗?

!我的回答所依据的信息已过时,请在我的回答下方查看更新。


脚本出错的原因是因为:

"The importation of frameworks via the use statement is only supported in script libraries, not in other scripts or applets."

所以基本上:您不允许在常规 AppleScript 脚本中使用 use 语句。您只能在脚本库中使用它。

为了解决这个问题,我们创建了一个 "script library",它只是另一个 AppleScript 文件。假设我们称这个脚本库为 chewbacca.scpt。您需要将脚本放在 Mac 上的特定位置。 (您有此位置的 few options)。 AppleScript 仅在尝试导入脚本库时查看这些位置。

然后,要使用脚本库,请执行以下操作:

tell script "chewbacca"
  display dialog "foo"
end tell

这应该会得到想要的结果。


更新:

阅读一些答案并阅读更多文档后:

AppleScript 的扩展方式是导入一个库,这些库被称为 osax(或 "Scripting Additions"),因为它们的文件名以 .osax 结尾。 OSAX 代表 "Open Scripting Architecture eXtension"。要导入 osax,我们在脚本中写入 use library(对此我不是 100% 确定)。通过导入 osax,我们可以使用该 osax 中的命令。

AppleScript(语言)没有用于以下内容的命令:用户交互对话框(display dialog)、读写文件、文件系统命令、日期函数以及文本和数学运算。

但是:Apple 确实提供了一个提供这些命令的 osax:StandardAdditions.osax,不难看出为什么这是最常用的 osax 之一。

要导入此 osax:

use scripting additions

现在回到我的问题:

我发现 AppleScript 在某些情况下表现不同:

  1. 脚本不导入 osax
  2. 脚本导入 osax(但不是 StandardAdditions.osax

在情况 1 中,似乎 AppleScript(运行时?)默默地自动导入 StandardAdditions.osax。我认为是这种情况,因为我可以使用 display dialog.

情况 2 AppleScript(运行时)不会自动导入 StandardAdditions.osax

我可以对这种不同的行为进行推理:

我怀疑对于第一种情况,他们想让人们更容易开始使用 AppleScript,因此他们会自动导入大多数 people/beginners 可能想要使用的基本命令。

情况 2 背后的想法可能是这样的: “开发人员明确导入了 osax,因此他们可能没有 需要 StandardAdditions.osax 所以我们不要自动导入它。

我在某个地方发现,始终通过将 use scripting additions 添加到脚本来显式导入 StandardAdditions.osax 是个好主意。 我以后会听从这个建议的。

您回答中的预测已过时。您现在可以在标准脚本中导入框架(AFAIR 自 Yosemite)。

如果您应用 use framework 语句,则必须添加

use scripting additions

能够访问display dialog