[macOS翻译]Handlers入门(第 3 部分,共 3 部分)

252 阅读12分钟

本文由 简悦 SimpRead 转码,原文地址 www.macscripter.net

本期专栏是介绍 AppleScript 中处理程序用法的系列专栏的最后一期。

本系列的第 1 部分介绍了处理程序,并讨论了编写和使用子程序处理程序的好处。该部分还探讨了子程序处理程序的编写和调用,以及处理程序参数的正确用法。你可以阅读第 1 部分这里 1

本系列的第 2 部分讨论了处理程序的变量范围,解释了如何从处理程序返回值,并演示了如何在应用程序 tell 语句中调用处理程序。您可以阅读第 2 部分 此处

到目前为止,我们对处理程序的讨论主要集中在子程序处理程序上,即自己编写并在整个脚本中调用的自定义处理程序。在本期专栏中,我们将讨论另一种处理程序:命令处理程序。

什么是命令处理程序?

命令处理程序是由应用程序、脚本附加程序或操作系统预定义的处理程序。就像子程序处理程序一样,命令处理程序可以在脚本中手动调用,使其执行。命令处理程序也可由应用程序或操作系统发送的事件调用和执行。

特定于脚本的命令处理程序

AppleScript 本身实际上可以在某些事件发生时调用特定的命令处理程序。保存和执行脚本的方式会影响哪些命令处理程序会被调用。

Run回调

默认情况下,每个 AppleScript 都有一个隐含的运行处理程序,其中包含脚本顶层的任何代码。例如

display dialog "Hello!"

在脚本编辑器中打开

也可以通过手动封装脚本顶层的所有代码,显式定义脚本的运行处理程序,如下所示:

on run
    display dialog "Hello!"
end run

在脚本编辑器中打开

在脚本中,运行处理程序可以隐含或显式定义,但不能同时定义。如果试图这样做,在编译脚本时将导致语法错误。例如

display dialog "Hello!"

on run
    display dialog "Hello!"
end run
--> Syntax Error - The run handler is specified more than once, or there were top-level commands in addition to the run handler.

在脚本编辑器中打开

启动已保存为应用程序的脚本时,会向脚本发送运行命令,并执行运行处理程序中的任何代码。同样,从脚本编辑器、脚本菜单等处运行脚本,也会向脚本发送运行命令。如果运行上述第一个示例,你会发现结果是一样的。

Open回调

保存为应用程序的 AppleScript 还能执行其他一些命令处理程序,以响应某些事件。打开事件就是其中之一。

当用户在 AppleScript 应用程序中拖放文件和文件夹时,会向脚本发送一条打开命令,并同时显示被拖放的项目列表。如果脚本只包含运行处理程序,则不会对事件作出响应,也不会发生任何事情。但是,如果脚本包含一个打开处理程序,那么该处理程序就会被执行,任何被丢弃到脚本上的项目都会通过一个参数传递给该处理程序进行处理。

下面是一个打开处理程序的示例,在这种情况下,该处理程序将简单地循环处理任何丢弃的项目,并在对话框中显示它们的路径。

on open theDroppedItems
    repeat with aDroppedItem in theDroppedItems
        display dialog aDroppedItem as string
    end repeat
end open

在脚本编辑器中打开

打开处理程序需要一个直接参数,其值将是所有下拉项目的列表。在上面的示例中,我将该参数命名为 "theDroppedItems"。只要符合变量命名标准,你可以为这个参数使用任何你想要的名称。

保存包含打开处理程序的 AppleScript 应用程序时,你会发现该程序的图标与典型的脚本程序图标略有不同。现在,它的图标上会出现一个向下的小箭头,表示可以将项目放到脚本上进行处理。

Idle回调

将脚本保存为应用程序时,可以选择将其保存为保持打开的应用程序。如果这样做,脚本就可以使用空闲处理程序,该程序将在脚本空闲时触发。

下面是一个正确使用空闲处理程序的示例。

on idle
    display dialog "The script is now idle."
end idle

在脚本编辑器中打开

脚本应用程序启动后,在其运行处理程序中的代码执行完毕后,就会处于空闲状态。此时,空闲处理程序中的任何代码都将被执行。从那时起,默认情况下空闲处理程序将继续每 30 秒执行一次,直到脚本退出。

您也可以选择更改调用空闲处理程序的频率。为此,你可以从空闲处理程序中返回你希望脚本在下一次空闲前延迟的秒数。例如,以下代码将使空闲处理程序每 5 秒执行一次。

on idle
    display dialog "The script is now idle."
    return 5
end idle

Open in Script Editor

Quit回调

保存为应用程序的 AppleScript 也可以在退出脚本时在退出处理程序中执行代码,但根据脚本是否保存为已打开的应用程序,该命令处理程序的功能略有不同。

下面是一个退出处理程序的示例,脚本退出时将执行该处理程序。

on quit
    display dialog "Goodbye!"
end quit

在脚本编辑器中打开

在普通的 AppleScript 应用程序中,一旦该处理程序执行完毕,脚本就会退出。但是,如果在保持打开的脚本应用程序中执行,脚本将不会退出。要让脚本退出,必须使用继续退出语句。例如

on quit
    display dialog "Are you sure you want to quit." buttons {"Yes", "No"} default button "No"
    if button returned of result = "Yes" then continue quit
end quit

在脚本编辑器中打开

在保持打开的脚本中使用上述代码时,一旦脚本退出,就会显示一个对话框,询问用户是否真的要退出。如果用户选择 "是",则将执行继续退出语句并退出脚本。如果用户选择 "否",脚本将继续运行。

特定于应用程序的命令处理程序

如果应用程序的编写支持命令处理程序的功能,那么应用程序也可以在脚本中执行命令处理程序。这种性质的应用程序被称为可附加应用程序。

某些可附加应用程序支持在特定应用程序级事件发生时调用命令处理程序的功能。“邮件”就是这样一个应用程序。

在邮件中,可以配置一条规则来分析邮件,然后在符合特定条件时运行 AppleScript。要在基本层面上使用这一功能,只需在附加脚本的运行处理程序中加入代码即可。这样,如果指定的条件得到满足,脚本运行处理程序中的任何代码都将被执行。

不过,从邮件规则中运行 AppleScript 的功能可以通过使用命令处理程序进行扩展,以提供更强大的功能。邮件 AppleScript 字典中的邮件套件定义了一个名为 "执行邮件操作 "的命令处理程序。如果在附加到邮件规则的脚本中包含该命令处理程序,它将代替运行处理程序被触发。

该命令处理程序有一个直接参数,当处理程序执行时,该参数将包含规则正在处理的邮件列表。下面的示例演示了该处理程序的正确用法。在此示例中,处理程序中的代码将打开通过参数 theMessages 传递的规则处理的任何信息。

using terms from application "Mail"
    on perform mail action with messages theMessages
        repeat with aMessage in theMessages
            open aMessage
        end repeat
    end perform mail action with messages
end using terms from

在脚本编辑器中打开

在上面的示例中,请注意命令处理程序周围有一个 using terms from 语句。这样做是必要的,以表明该处理程序属于 Mail 的 AppleScript 术语,从而避免在编译时出错。

一些可附加的应用程序还支持当用户在应用程序中执行某些操作(如点击按钮、选择菜单等)时触发命令处理程序的功能。MultiAd Creator 就是这样一款应用程序,它允许将 AppleScript 附加到应用程序界面中的菜单等处。通过这种方式,你实际上可以修改应用程序的内置行为,并在某些用户事件发生时采取不同的行动。例如,你可以重新映射 "保存 "菜单,这样每当用户试图保存文档时,就会先对原始文件进行备份。有关 MultiAd Creator 的 AppleScript 支持概述,请参阅 此处

地址簿是另一款能在某些用户事件发生时触发命令处理程序的应用程序。《地址簿》定义了许多命令处理程序,可以通过这些处理程序为《地址簿》创建插件脚本。这些命令处理程序可以在用户将鼠标移到滚动按钮上、选择联系人条目中的滚动按钮等情况下触发。

在下个月的专栏中,我们将开始讨论 AppleScript Studio,它是 Mac OS X 开发者工具的一个功能集,可让你构建强大的应用程序,其用户界面与其他 Mac OS X 应用程序具有相同的外观和感觉。接下来,你会发现自己经常使用命令处理程序,以便在脚本运行和用户与脚本界面交互时执行 AppleScript 代码。

脚本添加命令处理程序

在结束处理程序的讨论之前,我想说的是,指令处理程序也可以通过脚本附加功能来定义。事实上,Mac OS X 内置的标准附加脚本就定义了多个命令处理程序。

其中一个处理程序就是处理 CGI 请求,它可以在标准附加组件字典中的 Internet 套件中找到。该命令处理程序可在打开的脚本程序中使用,以处理来自网络服务器的 CGI(通用网关接口)请求。

标准补充脚本中的文件夹动作套件也定义了一些命令处理程序,可用于创建文件夹动作脚本,对更多用户来说,这可能比使用 cgi 请求处理程序更有用。文件夹操作脚本可附加到 Finder 中的文件夹,在对这些文件夹执行某些操作时调用,例如打开文件夹、关闭或移动文件夹窗口、向文件夹中添加或删除项目。

下面是一个文件夹动作处理程序的示例,该处理程序用于显示添加到文件夹中的每个项目的名称。

on adding folder items to theAttachedFolder after receiving theNewItems
    repeat with aNewItem in theNewItems
        display dialog "New Item Detected: " & return & (name of (info for aNewItem))
    end repeat
end adding folder items to

[在脚本编辑器中打开](applescript://com.apple.scripteditor?action=new&script=%0Aon%20adding%20folder%20items%20to%20theAttachedFolder%20after%20receiving%20theNewItems%0A%09repeat%20with%20aNewItem%20in%20theNewItems%0A%09%09display%20dialog%20%22New%20Item%20Detected%3A%20%22%20%26%20return%20%26%20(name%20of%20(info%20for%20aNewItem))

要测试这个命令处理程序,你需要创建一个文件夹动作脚本,并将其附加到一个文件夹。首先创建一个包含上述代码的新脚本,并将其作为脚本文件保存到计算机上的 /Library/Scripts/Folder Action Scripts/ 文件夹中。然后,启动位于 /Applications/AppleScript 文件夹中的文件夹操作设置应用程序,并确认已选中 "启用文件夹操作 "复选框,以确保计算机已启用文件夹操作。要将脚本附加到文件夹,请单击 "文件夹操作设置 "窗口左下角的 + 按钮,然后导航到并选择所需的文件夹。系统会提示你选择一个要附加到文件夹的脚本。选择您刚刚创建并保存的脚本。以这种方式将脚本附加到文件夹后,就可以通过将项目放入文件夹来测试文件夹操作。如果一切顺利,那么每个放入文件夹的项目都会显示一个对话框,显示项目的名称。

总结

我们讨论处理程序已经有一段时间了,希望你开始明白为什么处理程序在不同情况下都很有用,有时甚至是必要的。正如我之前提到的,我之所以选择在此时重点讨论处理程序,是因为我的下一栏 2将开始讨论 AppleScript Studio。随着讨论的深入,你会发现 AppleScript Studio 会大量使用处理程序,尤其是命令处理程序。因此,我认为介绍处理程序是一个很好的开始。

下次再见:编写脚本即可!


www.deepl.com 翻译