:::

如何取得AutoIt回傳結果?如何編譯AutoIt命令列應用程式 / How to compile AutoIT as a Console Application

簡報2

AutoIt一般常作為自動操作Windows應用程式的圖形化應用程式(GUI Windows application),例如自動安裝檔。但如果要讓其他程式取得AutoIt的執行結果,那就要把AutoIt編譯為命令列應用程式(console application)。讓我們來看看怎麼做吧。


AutoIt腳本原始檔 / AutoIt Script

2018-12-16_232959

check-zotero-process-existed.au3的腳本很簡單,只有短短幾行。其功能是:

Local $aProcessList = ProcessList("zotero.exe") ; 取得名為「zotero.exe」的程序列表

If $aProcessList[0][0] > 0 Then ; 如果有符合該名字的程序
    ConsoleWrite("true") ; 命令列顯示true
Else  ; 否則
    ConsoleWrite("false") ; 命令列顯示 false
EndIf  ; 結束偵測

這個腳本的重點是用ConsoleWrite()來顯示要回傳的資訊,不過實際上沒這麼簡單……

無法取得回傳訊息 / ConsoleWrite() isn't working

image

通常我們編譯au3腳本的方法,都是直接用AutoIt Script Editor (SciTE-Lite)執行編譯(Build),取得執行檔exe「check-zotero-process-existed.exe」。

image

再使用命令提示字元呼叫check-zotero-process-existed.exe的時候,實際上卻不會出現任何訊息。

為什麼會發生這個問題呢?

image

AutoIt的API手冊ConsoleWrite裡面寫到:

This does not write to a DOS console unless the script is compiled as a console application.

(如果不把腳本編譯為命令列應用程式,它就不會顯示在DOS命令列中。)

喔?命令列應用程式?這可是一個重要的關鍵字。

image

AutoIt的Compiling Scripts with Aut2Exe說明中,講到了可以用命令列的方式,加入「/console」參數之後,就可以讓AutoIt把腳本編譯成命令列應用程式。

至於實際上怎麼做呢?讓我們繼續看下去。

編譯命令列應用程式 / Compile Console Application

我們要用命令列來編譯AutoIt腳本的話,要先確認Aut2exe.exe的路徑與AutoIt腳本的路徑。

1. 確認Aut2exe.exe路徑 / Path of Aut2exe.exe

首先,我們要知道你電腦裡面安裝AutoIt時,把「Aut2exe.exe」放到哪裡去了。

通常它的路徑會如以下所示,以藍字標示:

C:\Program Files (x86)\AutoIt3\Aut2Exe\Aut2exe_x64.exe

2. 確認AutoIt腳本的路徑 / Path of AutoIt script

再來要確認AutoIt腳本的路徑。我先把上面的「check-zotero-process-existed.au3」放到D磁碟的根目錄下,以紅字標示路徑如下:

D:\check-zotero-process-existed.au3

3. 建立編譯命令 / Compile Command

把Aut2exe.exe的路徑與AutoIt腳本的路徑,以及編譯參數的指令結合在一起之後,編譯命令如下,請注意兩個路徑前後都應該加上雙引號「"」,以避免路徑中出現空格的問題:

"C:\Program Files (x86)\AutoIt3\Aut2Exe\Aut2exe_x64.exe" /In "D:\check-zotero-process-existed.au3" /x64 /console

如果你的電腦不是64位元而是32位元,則「/x64」請改成「/x32」。要確認自己的Windows到底是64位元還是32位元,請參考「如何判斷您的電腦執行的是 32 位元版本或 64 位元版本的 Windows 作業系統」。

image

請開啟命令提示字元,輸入上述的指令並執行,沒有任何特別的錯誤訊息的話,那就是順利編譯完成了。

image

執行「D:\check-zotero-process-existed.au3」的時候,就會正常顯示ConsoleWrite()的內容。

讓PHP取得AutoIt命令列應用程式的結果 / PHP call AutoIt and get Return Value

只要AutoIt變成了命令列應用程式,我們就能用其他語言來執行AutoIt,並且取得它的執行結果。以PHP來說,語法如下:

echo exec('D:/check-zotero-process-existed.exe');

image

輕鬆寫意。


小結 / In closing

本篇作為例子的AutoIt腳本只是一個偵測現在是否指定程序有在執行的例子。也許會有人馬上就會問:「為什麼不要寫DOS指令組成批次檔(Batch File Command, bat)來執行,而要用AutoIt呢?」

我選擇使用AutoIt的原因是,因為AutoIt操作Windows更為簡單,程式邏輯也比DOS指令好寫許多。但AutoIt並非沒有缺點,我把它容易造成問題的兩個缺點歸納如下:

image

  1. 在於容易被防毒軟體認為帶毒:AutoIt編譯的exe軟體是使用者自行產生的檔案,而非網路上公認安全的軟體,因此它很容易被防毒軟體主動擋下。要解決這個問題的做法是將該exe檔案加入防毒軟體的排除掃描清單(白名單)中。
  2. 檔案大小:check-zotero-process-existed.au3這種只有6行的程式碼,腳本檔不到1KB,但編譯成exe之後就會變成將近1MB的大小。如果儲存空間有限,AutoIt就不是很好的選擇。

撇去上述兩個缺點來看,我個人還是比較喜歡用AutoIt勝過於DOS指令。最近一些網頁應用也直接呼叫AutoIt來操作Windows裡面的軟體,蠻好用的。


那麼這次將AutoIt腳本編譯成命令列應用程式的教學就到這邊了。你有用過AutoIt嗎?你都拿他來做什麼呢?AutoIt跟DOS指令的選擇上,你的看法如何呢?歡迎在下面的留言處跟我們分享你的想法。如果你覺得我這篇教學寫的不錯的話,請幫我在AddThis分享工具按讚、將這篇分享到Facebook等社群媒體吧!感謝你的耐心閱讀,讓我們下一篇見。