網頁標題: 11 巨集與錯誤處理

Warning: fopen(/home/crazy/www/cmsb/bcj/has_read.php): failed to open stream: Permission denied in /home/crazy/www/compose/reading.php on line 2070

Warning: fputs() expects parameter 1 to be resource, bool given in /home/crazy/www/compose/reading.php on line 2072

Warning: fclose() expects parameter 1 to be resource, bool given in /home/crazy/www/compose/reading.php on line 2073
 
﹗﹗﹗觀看留言:此文章已經有2則留言 ﹗﹗﹗


 在此簡單介紹 AutoIt 裡的「巨集」。巨集 (macro) 可以看成唯讀的變數,它的名稱皆為 @ 開頭,在程式碼中出現的位置跟變數也一樣,然而「唯讀」表示不能直接指定其值。雖然無法指定值,但是多數巨集用來反映目前執行中面對的環境,因此一旦環境經由使用者操作或腳本內的程式執行而改變,巨集的值就會隨之而變。

 巨集主要有三大類型:一、整體執行環境的資訊,二、腳本載入、執行期間的環境資訊,三、替幾個特別常用的字串或值設置別名。本文將簡要描述並舉例三大類型的巨集,然後介紹擁有錯誤處理功能的 @error 及 @extended 的用法。

 註:這是我個人的分類方式,跟其他文章或者 AutoIt 官方說明文件不同。

 隨著本文也可以參考下列二網頁,其中第二個為英文版的完整巨集列表,可參見本文未提到的巨集。

  1. AutoIt!! 巨集
  2. Macros Reference - AutoIt Related


 整體執行環境的資訊包含腳本所在的硬體、作業系統及 AutoIt 相關資訊,以及目前電腦時鐘所顯示的時間。

 硬體資訊比如 CPU 結構 (@CPUArch), 32 位元與 64 位元 CPU 分別得到 "X86" 與 "X64" 的不同結果。

 作業系統資訊又分為 Windows 版本及語言、特殊用途的系統目錄、使用者帳號相關的設定等。主版本是 @OSVersion, 每個版本又有 Service Pack, 巨集是 @OSServicePack, @OSLang 則代表作業系統的語言。特殊用途的系統目錄如 @WindowsDir 是 Windows 本身安裝的路徑,大多數應用程式安裝於 @ProgramFilesDir, 即 Program Files 目錄,「我的文件」路徑是 @MyDocumentsDir, IE 瀏覽器「我的最愛」路徑是 @FavoritesDir. 使用者帳號相關的設定如 @UserName 是目前使用者的 ID, @ComputerName 是電腦名稱。

 AutoIt 相關資訊包含版本 (@AutoItVersion), AutoIt 執行檔的完整路徑與檔名 (@AutoItExe), 以及 @AutoItX64 只在指定 64 位元 AutoIt 執行腳本時設為 1.

 電腦時鐘含有年 (@YEAR), 月 (@MON), 日 (@MDAY), 時 (@HOUR), 分 (@MIN), 秒 (@SEC) 等資訊。電腦也支援毫秒 (@MSEC), 通常用來做精確的時間戳記或者產生亂數用的參數。對「日」的解毒除了日期外,也可以用星期幾 (@WDAY), 或者今年的第幾天 (@YDAY).

 以下範例將印出使用者與電腦名稱、作業系統與 CPU 架構:


 腳本執行期間又細分為載入及執行階段。兩階段設置的巨集最大差別在於載入期間決定的巨集不會隨執行而改變內容,但是執行期間決定的巨集可由腳本自由地透過某些指令改變內容,甚至有些巨集只在特定的執行場合才有效。

 「載入」階段指的是使用者在腳本檔案上按滑鼠或 Enter 開始,到真正執行第一行腳本之間的小小時間片段,這段時間裡 AutoIt 從使用者指定之位置 (@ScriptFullPath) 讀入腳本檔案,這個路徑也被分成資料夾跟檔名用 @ScriptDir 及 @ScriptName 存取。今天也可能開啟的是 AutoIt 編譯出來的執行檔,而執行的是腳本文件還是執行檔也在這期間建立 @Compiled 巨集供區別。另外 @ScriptLineNumber 是一個除錯時相當有用的巨集,表示該巨集存在的行編號。

 「執行」階段的狀態又有全域性與區域性的差別。全域性狀態的巨集如工作目錄 (@WorkingDir), 每個程式執行期間都有工作目錄,當程式以相對路徑存取檔案時做為參考點。另外還有 @error 跟 @extended 會保留最近一次呼叫函式在函式裡設置的值,多用來檢查函式是否正確執行與傳回值是否可信。區域性的狀態大多發生在特定的函式裡,尤其事件處理專用之回呼函式,不在本文範圍,不過 @NumParams 存在於所有函式,可得知呼叫者有親自給定的參數數量,當函式的行為與參數數量有關時很管用。

 以下示範用 @NumParams 寫一個創造一維陣列的函式:

 執行將發現答案是一個陣列內含四個元素,修改 CreateArray 的參數數量也影響陣列元素數量。迴圈裡 Eval 接受一個變數名稱並傳回其值,這是另一種向變數取值的方法,參數列八個參數故意命名成有規律以允許這種存取方式,注意 Eval 的變數名稱不用加 $. 然而,AutoIt 中無真正可變長度的參數列,也就是上例列了八個參數則最大只能做出八個元素的陣列。


 巨集的第三個用途為易讀的別名。被賦予別名的內容分為常用字串跟 GUI 常數。

 常用的基本字串有 @CR (Carriage Return), @LF (Line Feed), 以及 @TAB (Tab). @CR 是「歸位」字元,也做「迴車」,原本的意思是將打字游標移到行首,但今天電腦上有些場合直接讓它當作「換行」。@LF 也可以當換行用途,在 Unix 類型的作業系統上通常編輯出來的文件是以 @LF 換行。然而 Windows 環境下的換行多為 @CR & @LF, 即兩者連接在一起,AutoIt 以 @CRLF 為其巨集。

 GUI 常數也不在本文範圍,通常當參數傳給圖形化使用者介面 (GUI) 相關的函式,表示視窗被顯示的狀態如最大、最小化等。


 以下開始針對 @error, @extended 這二個腳本執行期間負責記錄函式執行狀態的巨集進行示範。當設計函式時,除考慮到參數可能不合法外,與其他環境的互動過程中也可能遭到意外,如指定的檔案無法存取、指定的硬體正在忙碌,甚至跟別的程序(執行中的程式)合作過程中來自對方的錯誤訊息。

 當函式內部無法決定或不應該決定如何處理錯誤,可以選擇 Return 結束自己,但在結束時必須告訴呼叫者自己結束的原因。AutoIt 習慣上函式結束有三種情形:一、正常結束,通常 @error 為 0. 二、專用的錯誤情形,如檔案讀取已到最後,但不讀到最後也不知道檔案讀取完畢,通常設置 @error 為負值。三、一般錯誤,如上述情形,@error 通常為正值。以下把範例 8-4 改成用 @error 通知呼叫者錯誤內容:

 上例 Sum1ToN 有二個主要特徵:函式之前有一段關於參數及回傳值的完整註解,函式 Return 之後都接 SetError. 當使用 @error 將錯誤回報給呼叫者時,必須有詳細註解說明 @error 的值與意義,此「註解」也可以是一個跟程式碼分開的參考文件。註解或文件內也可以說明發生錯誤時函式傳回的結果,不過當註解只有明確指出 @error 而未提及回傳值,發生錯誤時的回傳值該視為不可信或未定義。

 SetError 是內建函式,會設置 @error 及 @extended 值。三個參數依序為指定之 @error, 指定之 @extended, 以及傳回值,它會將前二個參數賦與對應的巨集,然後將第三個參數內容原封不動傳回。因此 SetError 很常寫在 Return 之後,可將第三個參數又直接傳出函式。

 @extended 較少使用,多代表附加的資訊,而此資訊不限於成功或失敗時使用,但若被設置則也應明確寫於註解或文件中。此處不多舉例,不過之後將有範例會讀取 @extended 值。

 上例只以 MsgBox 向讀者展示 @error 結果,然而實際使用時,經常將 @error 配合 Switch...Case...EndSwitch, 或者 If @error Then 來用,如範例 6-1 以 @error 配合 Switch 敘述做出對應的處理。


回 · 我的 AutoIt 學習筆記 這一篇文章封面


本文張貼者:Bo-Cheng Jhan〔張貼時間:民國105年5月21日(星期六)19點05分〕

部落格首頁


學習的故鄉首頁
本站公告:〔您越需要我們,我們就越有創意〕 本站說明書:〔發現故鄉還有改進的地方,請來信告訴原丁們〕
觀察應用學習點數 :〔咱的故鄉有您的參與,會使我們有更大的發揮空間,展現更豐富精彩的學習畫面〕 〔期待藉由無障礙網頁設計,能讓視障小朋友更愛看書、更愛寫作且更愛學習〕:盲用電腦「心得分享」
〔為了讓我們有乾淨的學習環境,請勿任意在本站散播商業廣告與不合法文件或聯結〕:本站宣示