2017年7月5日 星期三

AutoIt 執行外部程式進階應用

在前一篇AutoIt 執行外部程式 中介紹了AutoIt執行外部程式的方式,這篇再補充進階的應用,可以強化整個程式執行的方便性,在這一篇AutoIt 執行外部程式 中我們呼叫了外部程式pspasswd.exe,這個程式必須同時放在程式可以存取的地方,但是如果我們在企業中要佈署這個程式時有時侯這支工具程式不一定會放在每一台電腦中,可行的做法如下:
  • 將AutoIt編譯過的程式與pspasswd.exe 放在一起以壓縮軟體打包在一起後進行佈署
  • 將pspasswd.exe 程式事先佈署於每一台電腦以便AutoIt進行呼叫使用
其實AutoIt提供了一個Function 可以將檔案包含在編譯Au3檔案後的執行檔中,透過這個方式可以將所需要的檔案包在單一執行檔中點選執行時就可以將檔案解壓出來,這對執行外部程式有很大的幫助,也可以確保執行的程式放置的位置。
以下是執行將檔案Include 到AutoIt程式碼的Function,使用上也非常簡單,將要Include 的檔案設定為Source,執行程式後解壓的檔案為dest,這裡比較重要的是dest 的位置必須指定已存在的路徑,否則會失敗。

FileInstall ( "source", "dest" [, flag = 0] )

下面這段程式就是在此次範例的程式碼,檔案的原始路徑及程式執行後解壓的路徑,只要設定好即可將檔案Include 進來。

FileInstall("c:\temp\pspasswd.exe", @ScriptDir & "\pspasswd.exe")

編譯過程中有幾點必須注意的,當把其它程式或檔案Include 後會造成單一執行檔案的空間變大,因此在編譯時可以設定壓縮率,就和一般的壓縮軟體一樣,壓縮率高執行過程會比較慢,相對可以節省比較大的空間,反之在犧牲空間下可以加快執行的速度,另外可以勾選以UPX 壓縮方式可大幅縮小檔案容量與磁碟空間,加速網路下載。

image

範例:



#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Compression=3
#AutoIt3Wrapper_UseUpx=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#cs ----------------------------------------------------------------------------

AutoIt Version: 3.3.14.2
Author: 奔騰兔開發誌
Date : 2017/07/05
Script Function: Script Demo
Description :呼叫外部程式的進階運用
Notes:http://pentiumto.blogspot.tw/


#ce ----------------------------------------------------------------------------


Opt("TrayIconDebug", 1) ;0=no info, 1=debug line info
Opt("TrayIconHide", 0) ;0=show, 1=hide tray icon

Dim $sNowtime=@YEAR &"-"& @MON &"-"& @MDAY &" "& @HOUR &":"& @MIN

ConsoleWrite($sNowtime & " [Info] " & @ScriptLineNumber & " 自訂訊息可以在開發過程除錯 "&@CRLF)



FileInstall("c:\temp\pspasswd.exe", @ScriptDir & "\pspasswd.exe")


Dim $sNewPassword = "NewPassword"


_ExecReset()


Func _ExecReset()


RegWrite("HKEY_CURRENT_USER\Software\Sysinternals\PsPasswd" , "EulaAccepted", "REG_DWORD", "1")

Sleep(1000)

RunWait(@ComSpec & " /c " & "pspasswd.exe \\" & @ComputerName & " administrator " & $sNewPassword,@ScriptDir,@SW_HIDE)


EndFunc


2017年7月4日 星期二

AutoIt Windows GUI 程式開發(一)

完成安裝AutoIt 編輯程式後同時會安裝許多的好用工具,其中一個就是GUI設定工具,但是奇怪的時安裝完成後會不會建立執行連結到程式集中,所以必須自行點選到程式的安裝路徑。
若安裝過程中沒有特別選擇其它的路徑,他將會在C:\Program Files\AutoIt3\SciTE\Koda\FD.exe
執行程式後即可進行GUI的設計,程式啟動後分為5個區域,每個區域都可獨立搬動。
image
上方下拉功能表是程式的主要功能選項,並且可以選擇要加入的GUI物件,當然物件的數量不像Virtual Studio 來的多,但是足夠一般的應用。
image
左側是以樹狀顯示物件的清單,下方是物件的參數
image
若同時設計多個Form 則可在右側Form List 檢視及切換
image
中間的Form 即是GUI設計重要的畫布了,將想要呈現的畫面及物件在Form 裡擺設好,在未來程式執行時即依照擺放位置執行。
image

Koda 是AutoIt 的GUI設計程式,但是僅是做GUI畫面的設計,並不含程式碼的編輯,所完成的GUI程式碼還是要在原本的SciTE 編輯程式來做程式的開發,但是比起在SciTE編輯器中一行一行的撰寫GUI程式碼要來的方便快速,下一篇再來說明Koda 的使用方式。
image

2017年7月3日 星期一

AutoIt 執行外部程式

除了自已可以透過AutoIt語法寫出想要的功能,但是有時侯如果作業系統或已有現成的工具可以達到想要的目的。直接執行工具不失為一個省時省力的好方法,AutoIt 提供了蠻多執行外部程式的方式,Run()、RunWait()、RunAs()、RunAsWait()、ShellExecute()、ShellExecuteWait()等等,都可以執行外部程式或者自行撰寫的Batch File。
選擇那一種方式執行外部程式端看最終的目的,善用F1 可以獲得詳細的說明,這篇以RunWait()解說執行外部程式為範例,程式的目的是重置Windows 的管理者密碼,使用Sysinternals 所提供的PSPasswd.exe 工具,之後有機會會介紹一下Windows Sysinternals ,裡面提供了不少好用的工具,而且是微軟所提供,安全性及穗定性也較有保障。

 RegWrite("HKEY_CURRENT_USER\Software\Sysinternals\PsPasswd" , "EulaAccepted", "REG_DWORD", "1")
這一段程式是預先同意程式License Agreement,避免執行程式跑出意外的視窗如下:

image

PsPasswd 提供修改密碼的功能,我們可以執行一次程式看看提供程式提供了那些參數,在此不額外贅述,請參考下方
image


RunWait(@ComSpec & " /c " & "pspasswd.exe \\" & @ComputerName & " administrator " & $sNewPassword,@ScriptDir,@SW_HIDE)

這一段程式是最主要的功能,使用RunWait()的功能是執行外部程式,並等待程式執行結束後回到原來的AutoIt 程序,如果使用Batch File 很難達到這一點,最好用的是加上@SW_HIDE 參數後可以達到背景執行,透過派送工具執行時一般使用者是沒有感覺的。


範例:



#cs -------------------------------------------------------------------

AutoIt Version: 3.3.14.2
Author: 奔騰兔開發誌
Date : 2017/07/03
Script Function: Script Demo
Description :呼叫外部程式的簡單運用
Notes:http://pentiumto.blogspot.tw/


#ce -------------------------------------------------------------------


Opt("TrayIconDebug", 1) ;0=no info, 1=debug line info
Opt("TrayIconHide", 0) ;0=show, 1=hide tray icon

Dim $sNowtime=@YEAR &"-"& @MON &"-"& @MDAY &" "& @HOUR &":"& @MIN

ConsoleWrite($sNowtime & " [Info] " & @ScriptLineNumber & " 自訂訊息可以在開發過程除錯 "&@CRLF)


Dim $sNewPassword = "NewPassword"


_ExecReset()


Func _ExecReset()


RegWrite("HKEY_CURRENT_USER\Software\Sysinternals\PsPasswd" , "EulaAccepted", "REG_DWORD", "1")

Sleep(1000)

RunWait(@ComSpec & " /c " & "pspasswd.exe \\" & @ComputerName & " administrator " & $sNewPassword,@ScriptDir,@SW_HIDE)


EndFunc