AppleScript 是 Apple 強大的 macOS 自動化語言。以下是如何使用它來加快您使用 Mac 時的工作流程。

歷史

AppleScript 於 1990 年代初在 Apple 誕生,旨在實現 Mac 操作系統的現代化。它部分源自早期的腳本語言,該腳本語言由最初的 Mac 架構師之一 Bill Atkinson 設計,他編寫了最初的 Mac 圖形系統 QuickDraw。

在早期的 Mac 上,阿特金森設計了一個基於卡片的開發環境,稱為 HyperCard ,以及與之配套的腳本語言 HyperTalk。開發人員可以將小型 HyperTalk 代碼片段附加到用戶界面元素,例如按鈕、文本字段和列表。

但是,Apple 想要一種方法來編寫腳本並控制整個 Mac OS,而不僅僅是一個應用程序。 HyperTalk 的一些元素被徵用,並添加了其他腳本元素。結果是 AppleScript。

30 年前首次發佈時,Mac OS 隨第一個彩色版本 System 7 一起發布,Mac 還附帶了一個輕量級的腳本編輯器應用程序,該應用程序在 macOS 中一直存在到今天。

在 1990 年代出現了大量第三方 AppleScript 開發工具,包括 Facespan 和 UserLand Frontier。

入門

AppleScript 和 macOS 的腳本編輯器應用程序允許您編寫和選擇性地記錄腳本,這些腳本在 macOS 中具有可以定向的目標。 AppleScript 語言相當簡單且類似英語,學習起來輕而易舉。

為簡單起見,大多數 AppleScript 都遵循主謂模型,在這種模型中,您首先說明您要將命令指向哪個或哪些對象,然後告訴這些對像要做什麼。對象可以是應用程序、窗口、UI 元素或應用程序中的數據。

AppleScript 編輯器窗口如下所示:

AppleScript Editor

窗口頂部是一個面板,您可以在其中鍵入腳本,底部面板用於輸出和調試。

您可以通過單擊工具欄中的編譯(錘子)按鈕來檢查腳本語法的準確性。 AppleScript Editor 將編譯您的腳本並突出顯示任何錯誤。

如果腳本編譯成功,您將看到它的所有語法顏色都更改為在設置 窗口中定義的顏色。稍後我們將進入下面的設置窗口。

編譯完成後,單擊工具欄中的播放 按鈕運行您的腳本,然後單擊停止 按鈕停止它。

您還可以通過按記錄 按鈕然後轉到另一個應用程序並執行一些操作來從其他應用程序錄製腳本。正在錄製的應用程序必須編寫為支持 AppleScript 錄製。

完成錄製後,返回 AppleScript 編輯器並按 停止 按鈕。

體系結構

AppleScript 基於稱為開放腳本體系結構 (OSA) 的底層技術。 Apple 特意設計了 OSA,以允許插入其他腳本語言並用於自動化 Mac。 AppleScript 只是一種 OSA 語言。

後來 Apple 為 OSA 添加了 JavaScript 支持,現在也允許使用 JavaScript 來控制 Mac。

在更低的層次上是另一種稱為 AppleEvents (AE) 的 Apple 技術。 AppleEvents 是一種應用程序間通信 (IAC) 設施,它允許應用程序和進程相互通信。

AppleEvents 通常有一個四字符代碼表示類或事件組,然後是另一個四字符代碼表示事件類型本身。通過發送和接收 AppleEvents,macOS 應用程序可以相互觸發以執行某些操作。

AppleScript 基於 AppleEvents 並使用 IAC 機制在系統周圍傳輸消息和數據。

詞典、術語和套件

為了讓 AppleScript 正常工作,應用程序必須定義和發布它們支持的事件。通過這樣做,他們向其他應用程序宣傳如何控制它們。

在大多數情況下,在 macOS 中,支持 AppleScript 的應用程序定義了 AppleScript 字典,這些字典定義了它們支持哪些事件和腳本元素,以及這些事件是如何在外部觸發的。通過發布字典,其他應用程序可以看到如何使用 AppleScript 控制應用程序。

每本詞典都定義了腳本術語和一個或多個 AppleEvent 套件-以及在每個套件中的事件。有幾個公開可用的實用程序可用於查看應用程序中包含的 AppleScript 詞典。

在從應用程序錄製 AppleScript 時,這些字典尤其重要,因為錄製系統依賴於讀取和接收字典中定義的事件和數據。腳本編輯器還使用字典在運行 AppleScript 代碼之前驗證和檢查它。

Apple 自己定義了幾個套件,例如 Core Suite、Finder Suite 等。第三方應用程序也可以定義自己的套件。

查看詞典和套件

AppleScript Editor 有一個內置的 AE 詞典查看器。要訪問它,請運行腳本編輯器,然後選擇文件->打開字典。 macOS 已經知道您 Mac 上的哪些應用發布了腳本字典,因此它只在列表中顯示這些應用:

打開字典窗口。

要查看任何應用程序的腳本字典,請從列表中選擇它並單擊選擇 按鈕。瀏覽器消失,詞典窗口打開:

腳本詞典查看器。

在詞典窗口的左上窗格中是應用程序支持的 AE 套件列表。單擊任何套件可在其右側的窗格中查看其所有支持的事件。

本例中,在蘋果的Bluetooth File Exchange app中,定義了一個AE套件Bluetooth File Exchange Suite,包含兩個事件:browse和send。

在字典窗口底部的窗格中,列出了每個命令或事件及其語法-即要將消息發送到的對象。在這種情況下,有兩種對像類型,文本和文件。

注意命令層次結構-在發送的情況下,有命令,然後是要發送的文件,然後是要發送到的設備。這種嵌套模式在 AppleScript 中無處不在。

在編寫 AppleScript 時,您必須習慣的初始概念之一是容器。除頂級對像外,所有內容都包含在其他內容中。

因此,在編寫腳本時,您通常會“告訴”應用程序執行某些操作,或者在其他內容中獲取或設置某些內容,在其他內容中修改其他內容。附加信息在 AppleScript 中使用修飾符提供-相當於英語元素,如“as”或“with”。

AppleScript 中經常使用“of”來向下鑽取容器層次結構。

例如,您可能會告訴某個窗口的標籤組選擇一個標籤,然後執行一些操作。 AppleScript 語法是高度嵌套的。

在 AppleScript 中,幾乎所有的東西都被認為是一個對象,它是對代碼和數據的封裝。對象可以發送和接收消息(稱為方法),以及這些方法作用的數據。

在詞典窗口工具欄的右側還有一個彈出菜單,允許您選擇要查看套件描述的語言。目前支持 AppleScript、JavaScript 和 Objective-C.

Objective-C 是 Apple 的基於 C 的對象編程語言,macOS 的大部分內容都是用它編寫的。它繼承自 macOS 的前身 NeXTStep,Apple 於 1997 年收購了 Steve Jobs 的另一家公司 NeXT , Inc.

隱藏的 AppleScript 實用程序

最初 macOS 附帶一個名為 AppleScript Utility 的應用程序,它隱藏在/System/Library/Core Services 中。您過去可以運行此應用程序來設置 AppleScript 的行為方式,但現在可以從/Applications/Utilities 中的主腳本編輯器應用程序訪問它的大部分選項。

首先,啟動腳本編輯器,然後選擇腳本編輯器->設置打開設置窗口:

設置窗口。

設置窗口中有四個選項卡:

一般 編輯 格式化 歷史

編輯格式化 允許您在腳本編輯器窗口中設置文本詳細信息,例如字體、顏色、縮進、建議和換行。

History 提供日誌記錄和日誌條目數等功能。

常規 選項卡中,您會發現許多以前由腳本實用程序控制的功能。這包括是否使用 AppleScript 或 JavaScript,是否顯示或隱藏“告訴”應用程序菜單,字典查看器的設置,以及是否顯示或隱藏 AppleScript 菜單欄圖標(我們稍後會談到)。

您還可以選擇一個應用程序來編輯腳本。事實上,您不需要使用腳本編輯器來編輯腳本。任何文本編輯器都可以-您稍後可以將腳本導入或複制並粘貼到腳本編輯器中以運行。

腳本編輯器的一大優勢是語法高亮顯示和調試,因為您可以在同一個窗口中編輯和運行腳本。

如果您在“設置”中選中在菜單欄中顯示腳本菜單複選框,macOS 會將腳本菜單添加到菜單欄。從這個菜單中,您可以打開腳本編輯器,打開位於啟動盤/Library/Scripts 中的內置腳本文件夾,或直接運行 macOS 的內置腳本之一:

腳本菜單欄項

AppleScript語法

您會在 AppleScript 中反复看到幾種語法結構(關鍵字)。一些常見的是:

on if then else exists end

此外,AppleScript 中還有幾個動詞,例如 tell、open、choose、is、set、repeat、copy、try 等。

‘end’可以與 tell、if、repeat 等命令組合,形成代碼塊。大多數嵌套動詞塊必須以“結束”結束,以便在整個程序中保持流程控制。

特殊動詞“return”用於跳出代碼塊並返回到程序中的前一個執行點。

還有一些副詞通常跟在或修飾動詞之後——例如 with 和 without。

Handlers and properties

AppleScript 提供了 handlers-可以從另一個腳本或系統中的其他地方調用的特殊函數。有幾個標準的 AppleScript 處理程序,例如打開和運行。

AppleScript 首次啟動時,會運行打開處理程序。此處理程序允許您為腳本設置初始條件。另一個常見的處理程序是 run,它在 open 處理程序之後執行。

屬性是一個命名變量,可以設置為某個值以供以後使用或修改。例如:

property ChooseScriptPrompt:”Select compiled script file(s) containing folder actions”

這定義了一個名為 ChooseScriptPrompt 的屬性,其初始值設置為“:”。 “:”是必需的。

屬性通常在 AppleScripts 的頂部一次定義。

命名函數

您還可以定義自己的 AppleScript 命名函數,然後從腳本的其他地方調用它們。使用 to 關鍵字後跟函數名和空括號來定義函數。例如:

to ChooseFileFromFAScriptFolder()

(一些代碼)

end ChooseFileFromFAScriptFolder

每個命名函數必須以“ end”關鍵字後跟相同的函數名稱。名稱必須完全匹配,否則會出現語法錯誤。

要從 AppleScript 的其他地方調用自定義函數,請使用關鍵字“my”,後跟函數名稱和一個空括號。例如:

my ChooseFileFromFAScriptFolder()

open the result

特殊變量result是為函數返回值保留的。運行後,結果將包含該函數返回的任何內容。

在函數內部,您使用 return 關鍵字強制函數退出-一個可選的返回值被發送回調用函數。例如:

return SelectedScripts

Interrogating objects

AppleScript 中的對像有一個類-它描述了對象的類型。您可以使用 class 關鍵字找出對象的類。例如:

如果 ChosenScripts 的類是布爾值,則

錯誤號-128

在這個例子中,class’詢問 ChosenScripts 它是什麼類型的對像以及是否結果為布爾值(true 或 false),然後設置錯誤編號,否則什麼都不做。

請注意,這裡實際上使用了兩個類-布爾值和數字。 AppleScript Editor 提供方便的語法突出顯示,因此您可以輕鬆識別內置類名。

使用文件系統

通常在 AppleScript 中,您會想要告訴應用程序訪問磁盤上的對象。有幾個內置對象可以執行此操作,其中包括文件夾、文件和路徑。

macOS 文件系統中的標準位置也有幾個內置修飾符-例如用戶文件夾或特殊文件夾,如文件夾操作腳本:

將 UserScripts 設置為列表文件夾( path to Folder Action scripts folder from user domain) without invisibles

上面顯示的括號中的構造路徑告訴AppleScript首先評估並解析該表達式作為文件夾的路徑,然後處理該行的其餘部分.通常表達式的路徑被縮減為單個文件系統路徑,然後傳遞給其他一些命令進行處理。

在上面的示例中,我們獲取了用戶文件夾中 Folder Action scripts 文件夾的路徑,然後將其內容作為列表存儲在變量 UserScripts 中,不包括任何不可見文件。

一旦設置,變量 UserScripts 就可以在腳本的任何其他地方使用,以指示磁盤上該路徑的文件夾中的項目列表。

在 AppleScript 中,您可以添加單行或多行註釋,這些註釋會被編譯器忽略。

單行註釋在開頭用雙破折號 (—) 表示。

多行或塊註釋用 (* 和 *) 括起來。例如:

獲取用戶名

此腳本使用 UI 元素腳本來獲取當前用戶的名稱。

版權所有 2013 Apple Inc.

單行註釋幾乎可以出現在腳本中的任何位置-單獨一行或行尾。

Saving AppleScripts

目前,Script Editor 支持四種格式的保存腳本:

Script Script bundle Application Text

‘Script’saves腳本編輯器原生未編譯格式的 AppleScript。

“腳本包”以腳本編輯器的本機格式保存 AppleScript,但可以包含其他資源,例如外部文件。

“應用程序”將 AppleScript 保存為預編譯的可執行格式,可以在 Finder 中雙擊或由另一個進程啟動而無需腳本編輯器。

“文本”將腳本保存為純文本,可以使用任何文本編輯器打開。

要保存 AppleScript,請按鍵盤上的 Command-S,輸入名稱,從彈出菜單中選擇文件格式,然後單擊“保存”按鈕。

保存面板。

如果您在保存時從文件格式彈出窗口中選擇了應用程序,則會啟用另外兩個複選框:顯示啟動屏幕運行處理程序後保持打開狀態

選中第一個複選框會使腳本在啟動時顯示運行確認窗口,選中第二個複選框會強制腳本在運行處理程序完成後保持打開狀態。

應用程序選項。

如果您按住鍵盤上的 Option 鍵並從菜單欄中選擇 File->Save,Save 命令將更改為 Save As 這允許您以另一個名稱保存腳本的新副本。

綜合

現在讓我們看一個示例腳本,逐行分析。我們將使用位於 macOS 啟動盤上的/Library/Scripts/UI Element Scripts 文件夾中的內置探針菜單欄腳本。

此腳本以 try 和 end try 塊開始。 try 是一個關鍵字,它允許您運行一段代碼並在發生錯誤時捕獲錯誤。 try 塊必須以 end try 結尾。

您可以嵌套 try 塊來控製程序流程。

要處理 try 塊中的錯誤,請使用此腳本中使用的 on error 語法。 on error 總是在 try 行之後但在結束 try 行之前:

on error errMsg

display dialog”Error:”& errMsg

In this example ,如果發生錯誤,腳本會顯示一個簡單的對話框,其中包含消息“錯誤:”,後跟變量 errMsg 的內容。

接下來在腳本中,我們看到三個嵌套的 tell 塊,每個塊的末尾都有一個結束 tell 行。您使用 tell 將代碼塊定向到某個對象-在本例中為系統處理程序,但它也可以是另一個應用程序、文件系統對象、應用程序中的某些 UI 元素,甚至是數據。

在此示例中,第一個告訴塊告訴系統獲取所有可用屬性,然後獲取所有正在運行的進程的列表:

告訴應用程序“系統事件”

get properties

get every process

在下一個 tell 塊中,腳本告訴 Finder 獲取所有正在運行的應用程序的所有菜單欄,然後迭代每個菜單欄並獲取所有菜單欄中每個菜單中包含的每個項目。這變得非常多餘:

tell process”Finder”

get every menu bar

tell menu bar 1

get every menu bar item

獲取每個菜單欄項的每個菜單

獲取每個菜單欄項的每個菜單的每個菜單項

獲取每個菜單項的每個菜單項every menu of every menu bar item

get every menu of every menu of every menu item of every menu of every menu bar item

從這段代碼中,你很快就會意識到一個關於 AppleScript 編程最奇怪的方面:即當你想訪問一個對象時,你必須首先考慮最遠或最外層的對象,然後從那裡返回。

這與大多數面向對象編程語言的工作方式相反,您從頂級對像開始,然後從那裡向下訪問其成員。

這種語法通常會使 AppleScript 很煩人,因為它通常是您想要達到的目的的反向邏輯。

最後,腳本顯示一個帶有消息的簡單對話框:

display dialog “The’Probe Menu Bar’script was executed, it uses UI element scripting to return a list of當前正在運行的每個應用程序的每個菜單的每個菜單項

,以查看在 AppleScript 編輯器中運行它的結果。”

作為參考,下面是完整的腳本清單:

探測菜單欄

該腳本使用 UI 元素腳本返回每個菜單項的列表

當前正在運行的每個應用程序的每個菜單。

版權所有 2013 Apple Inc.

您可以將此 Apple 示例代碼合併到您的程序中,而沒有

限制。此 Apple 示例代碼已“按原樣”提供,

其操作的責任由您承擔。

進行更改後,您不得

將此 Apple 示例代碼重新分發為“Apple 示例代碼”。如果您要重新分發代碼,我們要求

您明確表示該代碼源自 Apple 示例

代碼,但您已進行了更改。

告訴應用程序“系統事件”

獲取屬性

獲取每個進程

告訴進程“Finder”

獲取每個菜單欄

告訴菜單欄 1

獲取每個菜單欄項

獲取每個菜單欄項的每個菜單

獲取每個菜單欄項目的每個菜單的每個菜單項

獲取每個菜單欄項目的每個菜單的每個菜單項的每個菜單

獲取每個菜單欄的每個菜單的每個菜單項每個菜單欄項的每個菜單的菜單項

顯示對話框“已執行“探測菜單欄”腳本,它使用 UI 元素腳本返回每個菜單項的列表

當前正在運行的每個應用程序的每個菜單,以查看在 AppleScript 編輯器中運行它的結果。”

出現錯誤 errMsg

顯示對話框“Error:” & errMsg

Logs

After you run在您的腳本中,如果單擊窗口左下角的類似列表的小圖標,窗口右側的窗格分隔符上會出現兩個額外的圖標:垃圾桶和時鐘。如果您單擊時鐘圖標,則會出現一個日誌窗口,其中包含腳本運行時的所有日誌消息-除非您已在“設置”窗口中關閉註銷:

日誌歷史窗口。

您可以點擊日誌窗口中的每一項左側可查看有關已記錄的每條消息或事件的詳細信息。

我們在這裡僅僅觸及了 AppleScript 的皮毛。在以後的文章中,我們將更深入地探討語法、特殊關鍵字、術語、錄製、腳本添加插件、第三方工具以及 Apple 的其他自動化應用程序 Automator。

Categories: IT Info