用AutoIt自動安裝和卸載程序

  由於代碼每天都會更新,編譯組每天晚上會針對當天的代碼編譯出一個新的Build(除非編譯不通過),而測試組第二天早上都會安裝前一天晚上編譯出的Build進行測試。
  一直以爲測試組每天都手動地重複着這些枯燥無味的卸載、安裝工作,直到同組的一個同事告訴我,測試組每天的卸載和安裝工作都是通過腳本自動實現的,無需人爲干預。
  原來他們使用了一款叫做AutoIt的工具。個人以爲,要實現這種自動化的功能,要麼讓程序以控制鼠標或鍵盤的方式進行實際的操作,要麼讓程序通過給 系統發消息的方式模擬鼠標和鍵盤的操作。無論使用哪種方式,要寫一個通用的工具,工作量還是比較大的。而這款現成的軟件,正好實現了期望中的功能。
  出於好奇的心理,從官方網站上下載了安裝文件autoit-v3-setup.exe。安裝完後,我們可以看到AutoIt不僅附有很詳細的文檔,而且還提供了豐富的樣例。這種腳本比較簡單,很容易上手。

原理和應用範圍

  AutoIt把Windows系統的API封裝成易用的Script函數。通過調用這些函數,我們就能很容易地讓程序模擬鼠標和鍵盤的操作。當 調用某些函數的時候,相當於我們對鼠標或鍵盤做了相應的操作。AutoIt的腳本非常簡單,我們只需要寫一段比較簡潔的腳本,調用某些函數就可實現模擬鍵 盤或鼠標操作的功能。如果用C/C++來實現相同功能,代碼量可能就不僅僅是一兩行了。
  在批量的自動化處理或重複性任務的處理時,使用AutoIt可以大幅減少我們的工作量。比如說,每天定時讓程序自動卸載、自動安裝一次。

實現自己的安裝/卸載程序

  這兒,我嘗試着寫了一個能夠讓AutoIt自動安裝和卸載的腳本。包括2個腳本:1.自動安裝AutoIt3;2.自動卸載AutoIt3。
  由於AutoIt不支持Debug(或許可以通過某些方式或第三方工具實現Debug的功能,但至少我沒發現),我通過寫Log文件來排查錯誤。每執行一個操作,都會在Log文件中記下執行的操作。

1.運行步驟
  • 自動安裝:
  1) 先判斷AutoIt的默認安裝文件夾中是否存在Uninstall.exe文件,如果存在,則說明AutoIt已經安裝,否則表明尚未安裝。(在實際情況 中,Uninstall.exe是否存在與程序是否已經安裝並沒有直接的關係,此處之所以這麼做是爲了簡化判斷。同樣,在安裝的時候,用戶可以自定義安裝 目錄,爲了簡化操作,此處我使用了默認安裝路徑”C:\Program Files\AutoIt3\”。)
  2) 如果AutoIt已經安裝,那麼直接退出安裝,否則進入步驟3;
  3) 通過自動點擊Next按鈕進行安裝AutoIt。安裝完成後,點擊Finish,退出。
  • 自動卸載:
  1) 先判斷AutoIt的默認安裝文件夾中是否存在Uninstall.exe文件,如果存在,則進入步驟2,否則表明Uninstall文件不存在,那麼退出卸載。
  2) 通過自動點擊Next按鈕進行安裝AutoIt。安裝完成後,點擊Close,退出。
稍加說明:我的運行環境是英文Windows XP,實際的情況可能因爲操作系統、運行環境和安裝程序的差異稍有不同。在這個例子裏,爲了避免操作複雜化,我並沒有把運行環境的所有可能情況都考慮進去,程序也沒有異常處理。

2.代碼編寫
  儘管可以使用文本編輯器或其他文本處理軟件編輯源代碼,不過使用AutoIt自帶的編輯器會更加方便。在本文的最後,提供了源代碼鏈接。

  現在,我們可以開始編寫代碼了。首先,我們寫自動安裝的程序。
  記得前面,我們提到過,AutoIt不支持Debug。因此,我們只好通過寫Log的方式排錯。在每次執行程序之前,我們必須先刪掉以前的Log文 件,然後判斷Uninstall.exe文件是否存在,如果存在,則在Log文件中寫上“Already Installed.”,並退出程序;否則在Log文件中記下“Starting Install”。代碼如下:

  ; THIS SCRIPT WILL DELTE THE LOG FILE
  FileDelete ( $logFileName )
  If FileExists( $uninstallFile ) Then
    _FileWriteLog( $logFileName, "Already installed.")
    Exit
  Else
    _FileWriteLog( $logFileName, "Starting install.")
  EndIf

  上面的一段代碼,; THIS SCRIPT WILL DELTE THE LOG FILE 是代碼的註釋。FileDelete ( $logFileName ) 執行刪除$logFileName文件的任務。此處,FileDelete()函數是刪除一個指定的文件,而$logFileName就是刪除的文件名。 在引用變量$logFileName之前,我們必須保證它初始化過。它的賦值函數如下:

$logFileName=@ScriptDir & "\" & "InstallLog.txt"

  其中,@ScriptDir是當前運行的Script文件所在的目錄。關於更多的函數、預定義變量或其他信息,可以查看程序自帶的文檔,非常詳盡。

  執行完以上代碼後,如果沒有安裝過,程序向下執行:

  ; Run Setup
  Run($SetupFile)
  Sleep(9000)

  Run($SetupFile)就是運行autoit-v3-setup.exe文件。Sleep(9000)讓程序睡眠9000毫秒,也就是 9秒。爲什麼要讓它睡眠呢?首先,程序啓動需要一定的時間,其次,也是爲了方便我們目測程序的安裝進度。至於睡眠的時間是9000毫秒還是8000毫秒, 這並不重要,只要夠長就行。

  現在,我們需要等待安裝文件出現,然後點擊“Next”按鈕進行下一步的操作。但是,我們如何讓程序知道我們要打開哪個對話框,點擊哪個按鈕,或者在哪個文本框裏輸入什麼內容呢?
具體到當前例子中,我們怎麼告訴程序要點擊下圖中的Next按鈕呢?
  我們可以通過函數ControlClick()來實現。
  在AtuoIt的文檔中,提到CtrolClick向指定控件發送鼠標點擊命令。輸入的參數如下:

  ControlClick ( “窗口標題”, “窗口文本”, 控件ID [, 按鍵 [, 點擊次數 [, X座標 [, Y座標 ]]]] )

參數

窗口標題 目標窗口標題。
窗口文本 目標窗口文本。
控件ID 目標控件。
按鈕 [可選參數] 要點擊的按鈕,可以是 “left”(左鍵),”right”(右鍵), “middle”(中鍵), “main”, “menu”, “primary”, “secondary”。默認值爲 left(左鍵)。
點擊次數 [可選參數] 要點擊鼠標按鈕的次數。默認值爲 1.
X座標 [可選參數] 要點擊控件的位置(X座標). 默認爲控件中心.
Y座標 [可選參數] 要點擊控件的位置(Y座標). 默認爲控件中心.

返回值

成功: 返回值爲1。
失敗: 返回值爲0。

  那麼,怎樣得到參數信息呢?我們可以使用AutoIt自帶的Window信息查看器。打開Window信息查看器之後,把鼠標懸浮在Next按鈕上,此時,在查看器中立刻會出現鼠標所在位置的信息,如下圖:

  因此,我們調用ControlClick(“AutoIt v3.3.0.0 Setup”, “&Next >”,”Button2″)就表示按下了Next按鈕。
  AutoIt支持自定義函數。由於很多地方需要點擊按鈕,然後輸出Log。爲了提高代碼利用效率,我們就自定義了一個函數ControlClickWithLog來完成此功能。關於ControlClickWithLog的實現,可 以查看本文源代碼。
  在函數ControlClickWithLog完成後,我們可以通過如下代碼實現點擊Next按鈕的功能:

  ;Click "Next"
  WinWaitActive($setupWinTitle)
  ControlClickWithLog($setupWinTitle,"&Next >","Button2",
            $logFileName,"Next Clicked.","Next Not Clicked.")
  Sleep(2000);

  對當前實例而言,安裝和卸載的步驟中的主要工作是點擊按鈕,所以其它部分和點擊Next基本上大同小異。在此就不再贅述。如需要更多信息,可以查看源代碼。
  另外,由於InstallAutoIt3和UninstallAutoIt3中有一些共用的部分,例如常量和函數。爲了提高代碼重用的效率,我們可以 把共用的部分放到一個命名爲UserFunction.au3的文件中。在其他文件中,只需在文件開始處加上#include ,我們就可以使用UserFunction.au3中定義的常量和函數了。

3.編譯exe文件
  安裝和卸載的源代碼分別是InstallAutoIt3.au3和UninstallAutoIt3.au3。選中 InstallAutoIt3.au3,右鍵,點“Run Script”,就可以運行自動安裝了。當然,我們還可以選中“Compile Script”生成InstallAutoIt3.exe可執行文件。這樣,無論目標機器上是否安裝了AutoIt,都可以運行。
  稍加說明,在程序中,我們假設autoit-v3-setup.exe、InstallAutoIt3.exe和UninstallAutoIt3.exe都放在了同一個目錄中。
  更進一步,如果希望每天都定時安裝或卸載,我們可以把程序InstallAutoIt3.exe和UninstallAutoIt3.exe加到Windows的計劃任務中,讓操作系統定時運行安裝或卸載程序。

小結
  除了模擬鼠標和鍵盤操作之外,AutoIt還提供了UI的腳本,本文就不再繼續討論。對AutoIt有興趣的朋友可以參考AutoIt聯機幫助和樣例。聯機幫助寫得很詳盡,樣例很容易上手。
  毫無疑問,AutoIt是一款非常不錯的軟件。不過很遺憾,它並不是一款開源軟件。儘管作者聲稱開放的源代碼包含了大部分功能,但也僅限於較早的幾個版本。如果對早期AutoIt的源代碼感興趣,可以從其官方網站下載。

相關資源
  鏈接:
    AutoIt官方網站:http://www.autoitscript.com
    歷史版本和部分源代碼下載:http://www.autoitscript.com/autoit3/files/archive/autoit/
    本文源代碼下載:http://delphi.zijinshi.org/wp-content/uploads/2010/11/Install_UnInstall_AutoIt.zip
  參考資料:
    AutoIt的聯機幫助和樣例

發佈了1 篇原創文章 · 獲贊 20 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章