顯示具有 AutoIt 標籤的文章。 顯示所有文章
顯示具有 AutoIt 標籤的文章。 顯示所有文章

2019年4月8日 星期一

AutoIt 學習筆記索引

我從 2010 年開始使用 AutoIt 幫助例行工作自動化, 也寫了一些函式庫來簡化程式碼, 更曾計畫為 AutoIt 寫一本書, 但寫了兩章就因為忙別的事停頓了. AutoIt 是我唯一使用的 PC 軟體程式語言 (.exe), 以後還會繼續整理筆記, 但排在很後面, 目前只能將已寫的筆記索引如後 :

403forbidden
AutoIt 的雜湊函式庫
AutoIt 的 FTP 功能
AutoIt 學習筆記 : 基本語法
用 AutoIt 搞定煩人的連線 Timeout 問題
AutoIt 內建 SciTE 的字型設定問題
# AutoIt 學習筆記 : 流程控制
AutoIt 學習筆記 : 陣列

~未完~

2018年5月17日 星期四

AutoIt 學習筆記 : 陣列

陣列是多個變數 (元素) 之集合, 而以單一變數名稱及索引來識別各變數 (元素), 由於搭配迴圈來存取變數值非常方便, 因此具有同一性質之變數常用陣列方式處理. 由於陣列為一組變數的集合, 因此其命名規則與變數相同, 亦即須以 $ 開頭, 只能使用英數字與底線, 不分大小寫. 陣列元素以中括號內的索引存取.

AutoIt 之陣列索引可以從 0 起算, 也可以從 1 起算 (例如索引 0 可用來存元素個數), 但對習慣 C, Java, PHP 等 0 起始語言者可能會不習慣, 因此仍以 0 起算為宜. 元素個數 (陣列長度) 可用 AutoIt 內建的 Ubound() 函數取得. 另外, AutoIt 的使用者定義函式庫 Array.au3 提供的 _ArrayDisplay() 函數則常用來以 GUI 方式顯示陣列內容.


本系列之前的筆記參考 :

# AutoIt 學習筆記 : 基本語法
# AutoIt 內建 SciTE 的字型設定問題
AutoIt 學習筆記 : 流程控制


一. 陣列之宣告與賦值 : 

1. 先宣告再逐一賦值 :

Local $a[3]   ;中括號內的整數表示元素個數
$a[0]=1         ;中括號內的整數表示元素之索引
$a[1]=2         ;中括號內的整數表示元素之索引
$a[2]=3         ;最大索引=元素個數-1


2. 宣告同時賦值 :

Local $a[3]=[1,2,3]      ;等號左邊為宣告 (中括號內是元素個數), 右邊為元素值
Local $Score[5]            ;宣告5個元素的1維陣列
Local $Score[$Count]  ;陣列元素個數可以用已賦值之變數 ($Count必須之前就已賦值)

注意, 陣列宣告後若不賦值, 則每個元素內容預設均為空字元 NULL, 即 Chr(0)


3. 多維陣列之宣告與賦值 :

多維陣列即元素也是一個陣列, AutoIt 最多可用到 64 維陣列.

Local $Array[10][20]             ;宣告 10 列 20 行之二維陣列 : 索引 (0, 0) ~ (9, 19)
$rows=UBound($Array, 1)     ;傳回陣列之列數=10 (參數預設=1)
$cols=UBound($Array, 2)      ;傳回陣列之行數=20
$dims=UBound($Array, 0)     ;傳回陣列之維數=2

二維陣列之宣告與賦值 :

Local $NameScore[2][2]=[["John", 91], ["Peter", 91]]   ;宣告同時賦值
Local $NameScore[2][2]                          ;先宣告
$NameScore[0]=["John", 91]                   ;賦值
$NameScore[1]=["Peter", 91]                  ;賦值


二. 拜訪陣列元素 :

顯示陣列之全部元素有兩個方法, 對於一維陣列只用一層迴圈即可 :

Local $Score[5]=[99,78,100,87,65]
Local $Str=""
For $i=0 To Ubound($Score)-1
   $Str &= $Score[$i] & " "                         ;以空格隔開
Next
MsgBox(0,"陣列全部元素",$Str)

自訂函式庫 Array.au3 提供 _ArrayDisplay($Array) 函式可以 GUI 形式顯示陣列內容 :

#include <Array.au3>
Local $Score[5]=[99,78,100,87,65]                                             ;宣告並賦值
_ArrayDisplay($Score, "陣列全部元素")                                   ;以GUI顯示陣列內容




對於多維陣列, 必須用多層迴圈來依序擷取元素, 例如 :

   Local $NameScore[2][2]=[["John", 91], ["Peter", 91]]               ;宣告二維陣列並賦值
   Local $Str=""                                                                                ;初始值
   For $i=0 To Ubound($NameScore,1)-1                                        ;外圈=拜訪列
      For $j=0 To Ubound($NameScore,2)-1                                     ;內圈=拜訪行
          $Str &= $NameScore[$i][$j] & " "                                        ;串接元素
          If $j==Ubound($NameScore,2)-1 Then $Str &= @CRLF    ;行結束就串跳行符號
      Next
   Next
   MsgBox(0,"",$Str)


三. 異質資料型態之陣列

通常陣列是一種元素資料類型均相同的資料結構, 但在AutoIt 並不禁止異質資料, 亦即元素可以是數值, 字串, 布林值等, 甚至可以是另一個陣列, 但這種用法是不宜的, 尤其元素是另一個陣列會嚴重拖慢執行速度.

   #include <Array.au3>                                  ;匯入自訂函式庫
   $AnotherArray=StringToASCIIArray("ABC")    ;將字串轉成ASCII碼陣列
   Local $Array[4]                                                    ;宣告四個元素之陣列
   $Array[0]=1                                                          ;元素0=數值
   $Array[1]=true                                                      ;元素1=布林值
   $Array[2]="字串"                                                 ;元素2=字串
   $Array[3]=$AnotherArray                                    ;元素3=另一個陣列
   _ArrayDisplay($Array, "陣列內容");                   ;元素3無法顯示
   _ArrayDisplay($Array[3], "子陣列內容");          ;元素3內容


執行後先顯示主陣列 :




可見元素 [3] 乃一子陣列, 游標移到標題按右鍵關閉視窗會執行第二個 _ArrayDisplay() 顯示子陣列 :




四. 稀疏陣列

多維陣列缺少部份元素即為稀疏陣列, AutoIt 允許稀疏陣列, 例如 :

   #include <Array.au3>
   Local $NameScore[3][3]=[["Peter",100],["John",67,82],["Mary"]]
   _ArrayDisplay($NameScore);




可見 Peter 與 Mary 有不完整之元素.


五. 陣列互相賦值

兩個陣列可以互相賦值, 例如 $ArrayA=$ArrayB 中, 左邊的 A 陣列內容會與 B 陣列完全相同,  即使兩者原先維度與資料類型不同.

  #include <Array.au3>
  Local $ArrayA[2]=[123,456]
  Local $ArrayB[3][3]= [["Peter",100,55],["John",67,82],["Mary",87,99]]
  $ArrayA=$ArrayB                                                 ;$ArrayA 會變成 $ArrayB 之備份
  _ArrayDisplay($ArrayA);


六. 使用者定義函式庫 Array.au3 中的常用函數 :

~~待續~~

AutoIt 學習筆記 : 流程控制

流程控制包括條件式之選擇結構與迴圈之循環結構兩大類. 本系列之前的筆記參考 :

AutoIt 學習筆記 : 基本語法
AutoIt 內建 SciTE 的字型設定問題


一. 選擇結構 (條件式) :

1. If 結構 :

AutoIt 的 If 有四種結構, 但是每一個 If, Then, Else, ElseIf 方塊內也可以有內部 If 結構 (巢狀). 注意, 每一個 If 區塊都要有 EndIf, 只有單行條件式不需要 EndIf.

(1). If … Then 單行結構 : (無 EndIf)

當只有一個運算式時, 可以將其直接放在 Then 後面, 整個 If … Then … 只有一行, 不可再加 EndIf  (否則執行錯誤), 例如 :

      If $x > 0 Then MsgBox(0, “結果”, “正數”)

(2). If … Then … EndIf  結構 :

當運算式放在 Then 的下一行時, 一定要用 EndIf 結束 (否則執行錯誤) :

      If $x > 0 Then
        MsgBox(0, “結果”, “正數”)
      EndIf

(3). If … Then … Else … EndIf  結構 :

      If $x > 0 Then
        MsgBox(0, “結果”, “正數”)
      Else
        MsgBox(0, “結果”, “非正數”)                   ;不可與 Else 同一行
      EndIf

(4). If … Then … ElseIf … Then … Else … EndIf  結構 :

      If $x > 0 Then
        MsgBox(0, “結果”, “正數”)
      ElseIf $x=0 Then                     ;這個 Then 不要忘記了 (注意 ElseIf 中間無空格)
        MsgBox(0, “結果”, “零”)
      Else                                          ;當所有 If 與 ElseIf 均不符時執行 Else (非必須)
        MsgBox(0, “結果”, “負數”)
      EndIf

2. Select Case … Case Else … EndSelect 結構 :

Select Case 是 AutoIt 兩個多重選擇結構之一, Select Case 較適用於多重條件式, 而另一個  Switch … Case 則較適用於單一條件式. 同一問題兩個結構都可解決, 但差別是 Select 的  Case 是放條件式, 而 Switch 的 Case 是放數值或值域 (Range). 例如 :

  Select
    Case $Score>90 And $Score<=100
        MsgBox(0, “榜單”, “正取”)
    Case $Score>80 And $Score<=90
        MsgBox(0, “榜單”, “備取”)
    Case Else
        MsgBox(0, “榜單”, “落榜”)
  EndSelect

  ** 注意, Case Else (中間空一格) 並非必要項, 即使無Case Else語法仍屬正確.

3. Switch … Case … Case Else … EndSwitch 結構 :

此結構功能雖與Select Case類似, 但是Switch後面須有一個運算式; 而Case放的是這個運算式的值或值域, 例如 :

  $Return=MsgBox(1, "確認", "確定要刪除這筆資料?")
  Switch $Return
    Case 1
        MsgBox(0, “回傳值”, “1=確定”)
    Case 2
        MsgBox(0, “回傳值”, “2=取消”)
  EndSwitch

  ** 注意, 運算式的值也可以是字串或布林值 :

  Switch $Answer
    Case true
        MsgBox(0, “答案”, “是”)
    Case false
        MsgBox(0, “答案”, “否”)
  EndSwitch

  而上述Select Case之榜單範例也可以改寫為 Switch 版 :

  Switch $Score
    Case 91 To 100
        MsgBox(0, “榜單”, “正取”)
    Case 81 To 89
        MsgBox(0, “榜單”, “備取”)
    Case Else
        MsgBox(0, “榜單”, “落榜”)
  EndSwitch

** 注意 : 當Case後面是值域時, 是包含這兩個值的, 所以從 Select 移植時必須依照 Select 之條件式改寫為適當之值域, 不要有所重疊. 當值域有重疊時, 會以第一個符合之Case優先.
** 值域也可以用在字串, 這時會自動將字串轉成數值再判斷區間落在哪一個Case, 例如 :

  $Return="O"    ;結果將顯示 “N-T”
  Switch $Return
    Case "A" TO "M"
        MsgBox(0, "回傳值", "A-M")
    Case "N" TO "T"
        MsgBox(0, "回傳值", "N-T")
    Case Else
        MsgBox(0, "回傳值", "U-Z")
  EndSwitch

4. ContinueCase 的用法

ContinueCase 是用來告訴 AutoIt 停止目前的 Case, 直接跳到下一個 Case 執行. 因為 Select 與 Switch 結構內之 Case均是單一執行分支, 僅能有一個Case會執行, 對某些程式邏輯而言形成結構上的限制, 這時就可以用 ContinueCase 來彌補, 不必跳出選擇結構. 注意, 此指令只能用在Case區塊內, 否則將導致嚴重錯誤.

  Switch $X
    Case 1
        $Y="進入測驗區, 請繼續…"
        ContinueCase   ;跳到下一Case繼續執行
    Case 2
        $Y &= "選擇題共20題, 請繼續…"
    Case Else
        $Y= "答題結束, 再見"
EndSwitch


二. 循環結構 (迴圈) :

AutoIt 有下列四種循環結構 :

  1. For...Next 
  2. For...In...Next
  3. While...WEnd 
  4. Do...Until 



1. For Next 迴圈 :

迴圈會以一 Local 變數為計數器循環執行直到符合 To 所指定之停止條件為止. Step 項非必須,  其預設值為 1. 當 Step 為正數時, 停止值必須大於或等於開始值, 迴圈才會執行; 當 Step 為負數時, 開始值必須大於或等於開始值, 迴圈才會執行. 下例計算 1~99 奇數之和 :

  1+3+5+7 … +99=2500 (注意, 不是加到 100, 因 99 下一階為 101 已超過停止值)

  Dim $Sum=0
  For $i=1 To 100 Step 2     ;$i是不須宣告之Local變數
     $Sum += $i
  Next
  MsgBox(0, "奇數和", $Sum)

2. For In Next 迴圈 :

此迴圈結構只能用在變數為陣列或 COM 物件集合時, 用來拜訪陣列或物件集合之元素.

範例 1 : 拜訪陣列元素

  Dim $Letter[4]=["A", "B", "C", "D"]     ;必須宣告Scope, 否則錯誤
  For $i In $Letter
     MsgBox(0, "字母", $i)
  Next

範例 2 : 拜訪物件集合

  $oShell=ObjCreate("shell.application")  ;建立物件
  $oShellWindows=$oShell.windows     ;產生視窗物件集合
  If IsObj($oShellWindows) Then        ;檢查物件集合是否建立成功
    $String=""
    For $Window in $oShellWindows    ;拜訪視窗物件集合之元素
       $String &= $Window.LocationName & @CRLF    ;產生顯示字串
    Next
    MsgBox(0,"視窗列表","已開啟的視窗:" & @CRLF & $String)
  Else
    MsgBox(0," 視窗列表","未開啟任何視窗")
  EndIf

3. While WEnd 迴圈

此結構為先測迴圈, 意即在執行迴圈內容之前, 先測試條件式 (關係或邏輯) 是否符合, 結果為真才進入迴圈執行. 下例計算 100 以內奇數之和 1+3+5+7+ … +99=2500 :

  Local $Sum=0, $i=1           ;初始值
  While $i < 100
        $Sum += $i            ;加總
        $i += 2                ;步進值=2
  Wend
  MsgBox(0,"奇數之和",$Sum)   ;結果為2500

4. Do Until 迴圈

此結構為後測迴圈, 意即會先執行迴圈內容一次, 再測試條件式 (關係或邏輯) 是否符合, 結果為真才繼續執行迴圈內容. 因此 Do Until 迴圈會至少執行一次. 計算100以內奇數之和 1+3+5+7+ … +99=2500 之程式改寫為 Do Until 如下 :

  Local $Sum=0, $i=1           ;初始值
  Do
     $Sum += $i               ;加總
     $i += 2                   ;步進值=2
  Until $i > 100
  MsgBox(0,"奇數之和",$Sum)   ;結果為2500
  ** 注意, 因為先後測之邏輯相反, 故Do Until與While WEnd 的條件式須相反

5. 與迴圈相關之指令

欲干涉迴圈結構之執行順序用的

(1). ContinueLoop : 跳過後面的運算, 直接進入下一個循環, 例如 1~100 之奇數和之計算 :

      Dim $Sum=0
      For $i=1 To 100                                  ;$i是不須宣告之Local變數
         If mod($i, 2)==0 Then ContinueLoop   ;偶數就跳過, 進入下一循環
         $Sum += $i                                      ;奇數就累加
      Next
      MsgBox(0, "奇數和", $Sum)             ;和=2500

(2). ExitLoop : 跳出目前的迴圈, 停止尚未執行完其他循環

下例計算輸入數目之累計和, 直到輸入Q跳出無窮迴圈

      $Sum=0
      While 1                                                                 ;使用無窮迴圈
            $Input=InputBox("累加計算","請輸入數字(Q 跳出)")  ;輸入數字
            If $Input=="Q" Then ExitLoop                      ;輸入 Q 跳出累計迴圈
            $Sum += $Input
      Wend
      MsgBox(0,"累加計算總和", "總和=" & $Sum)

2018年5月16日 星期三

AutoIt 內建 SciTE 的字型設定問題

我這幾天重新複習 AutoIt 時發現其內建的 SciTE 字型太小, 卻找不到哪裡可以設定, 搜尋網路才知道內建的 SciTE 並非完整版, 所以有些功能被閹掉了 :

Need help: Change SciTE editor font size

SciTE 的完整版可由下列網址下載 :

https://www.autoitscript.com/site/autoit-script-editor/downloads/

不過安裝前我將其上傳到 VirusTotal 掃描, 發現竟然有疑似 Troj 木馬 :




對於這種有疑慮的軟體還是不要冒險安裝, 繼續使用 AutioIt  內建的 SciTE 就好. 其實上面文章中有人回覆了一個方法調整內建 SciTE 的字型 : 按住 Ctrl 同時滑動滑鼠的 Scroll 滾輪即可放大縮小字型, 測試確實如此.

我也想用熟悉的 EditPlus 來編寫 AutiIt 程式, 但內建的 SciTE 裡面有 Tools/Compile/Build/Go 等方便工具, 所以就打消用 EditPlus 念頭. 不過我有找到一篇如何調整 EditPlus 設定使其方便於編寫 AutoIt 的文章, 參考 :

# AutoIt setup for EditPlus

2018年5月15日 星期二

用 AutoIt 搞定煩人的連線 Timeout 問題

今天花了一個早上的功夫, 終於把公司跳板機連線 Timeout 問題搞定了. 由於資安考量, 跳板機每次連線 40 分鐘就會斷線, 除非在斷線前點一下連線軟體上的延時按鈕, 否則斷線後就得插上識別證重新連線, 非常麻煩, 最後搞到沒人要用.

如果能夠排除連線麻煩的話, 跳板機其實還是蠻好用的, 因為每一個網元都存取得到, 因此上周評鑑前我就請 MIS 幫我重設密碼, 然後在跳板機上配置常用軟體與我的最愛連線, 總的來說除連線問題令人頭疼外我是非常滿意的. 所以上週五評鑑結束當天我就開始琢磨如何搞定這問題, 原先是想用 Python 的 PyAutoGUI 模組來寫個軟體機器人, 但這需要一點時間來學習, 似乎緩不濟急, 所以只好搬出已好幾年沒用的 AutoIt 來救援.

程式如下 :

While 1
  RenewConnection()     ;呼叫連線延時函數
  Sleep(300000)              ;休息 5 分鐘再更新
WEnd

Func RenewConnection()
  Run("C:\Program Files (x86)\SpringBoard\SpringBoard.exe")   ;執行跳板機連線程式
  Local $handle=WinWaitActive("SpringBoard Server Service List", "", 10)   ;激活連線程式
  ControlClick($handle, "", "Button11")     ;按一下延時按鈕
  ControlClick($handle, "", "Button2")       ;按一下最小化按鈕
EndFunc

此程式很簡單, 就是每 5 分鐘呼叫 RenewConnection() 這個函數去按跳板機連線程式的延時按鈕 (名稱為 Button11), 它會將連線逾時回復到最長 40 分鐘; 然後按 "最小化" 按鈕 (名稱為 Button2) 將跳板機最小化. WinWaitActive() 會激活跳板機連線程式, 並傳回此 GUI 程式之 Handler 作為操控程式內控件之參考. 注意, 必須傳入第三參數 timeout 等待視窗激活, 否則可能偶而無作用.

程式經 Compile/Build 編譯成 .exe 檔後測試 OK, 一整天都保持連線, 從此不用再重複插卡-輸入卡片密碼-連線跳板機-輸入跳板機密碼這個耗時 5 分鐘的繁瑣程序了.

自從公司電腦升版為 Win7, 導致原先用 AutoIt 寫的軟體機器人無法執行後, 我改弦易轍學會 WSH, 改成以網頁程式執行自動化作業, 從此 AutoIt 就被我束之高閣, 連正在寫的 AutoIt 實戰書籍也停了下來. AutoIt 多年沒使用忘得快光了, 好在以前有勤奮地寫下操典, 稍微翻閱一下就能恢復功力, 等 Python 弄完再回頭來整理.

下午在搜尋 AutoIt 範例時找到下面這個 Dunk 寫的超棒網站 :

http://dunkkm.blogspot.tw/?view=sidebar

看來是將 AutoIt 用在投資理財自動化的範例, 值得好好參學一番.

2013年9月3日 星期二

AutoIt 學習筆記 : 基本語法

這陣子可能又要修改機器人程式, 有一段時間沒用到 AutoIt 了, 所以今天把以前胡亂抄寫的筆記稍做整理, 順便複習一下.

一. 變數與常數 :
  1. AutoIt 的變數與常數名稱須以 $ 開頭, 只能使用英數字與底線, 不分大小寫 (常數名稱建議都用大寫以利識別), 所以 $var 與 $Var是一樣的. 注意不可以跟內建函式名稱相同. 變數可以先宣告再賦值, 也可以宣告同時賦值, 多個變數可以同時在一行宣告並賦值, 例如 :
    Dim $a                       ;宣告變數 (一定要有修飾詞)
    $a=1                          ;先宣告再賦值
    Dim $a=1                   ;宣告同時賦值
    Dim $a, $b, $c            ;同一行宣告多個變數 (一定要有修飾詞)
    Dim $a=1, $b, $c=3   ;同時宣告多個變數並賦值 (一定要有修飾詞)
    注意, 下列指令會有執行錯誤 :
    $a=1, $b=2, $c=3       ;沒有加修飾詞
    $a                               ;沒有加修飾詞
  2. 常數要用 Const 關鍵字宣告, 且其值不可更改, 否則執行錯誤. 例如 :
    Global Const $PI=3.14159
    ** 使用 Const 就是為了避免數值不小心被改變 (因重複宣告同名變數)
    ** 常數不能重複宣告, 否則執行錯誤 (變數是可以重複宣告的)
  3. 變數應該用 Dim/Local/Global 三個關鍵字宣告其有效範圍 (scope) :
    Dim : 宣告之變數如果在全域範圍中不存在, 那麼就是 Local; 否則就是 Global
    Local : 強制宣告變數之有效範圍為 Local
    Global : 強制宣告變數之有效範圍為 Global (即使在函數內宣告)
    ** 建議明確使用 Local/Global 宣告有效範圍, 不要使用 Dim 讓直譯器判斷
    ** 若未使用 Dim/Local/Global 修飾詞, 則必須在宣告之同時賦值, 否則會執行錯誤.
    ** 未宣告修飾詞之變數, 在程式最外層預設為 Global; 在函式或 If/For/While 等結構內為 Local
  4. 執行過程中常要輸出變數值, 以檢驗演算結果是否正確, 可用下列兩種輸出方式 :
     (1). 輸出到 STDOUT : ConsoleWrite("$Str=" & $Str & @CRLF)  
     (2). 輸出到訊息框 : MsgBox(0, "標題", $Str)  
    讀取輸入到變數中可用 :
    從 InputBox 讀取輸入 : $ID=InputBox("標題", "提示語")
  5. AutoIt與Javascript一樣屬於弱型態語言, 變數之資料型別於賦值時決定, 且可以隨時更換型別, 例如 :
    Local $x= “abc”   ;宣告 $x 為字串, 存入 “abc”
    $x=123                ; $x 因賦值為123而變成數值

二. 註解 :
  1. 單行註解 :
    AutoIt使用分號當作單行註解符號, 所有跟在分號後面的字串都會被直譯器或編譯器忽略. 但是字串中的分號為例外, 就只是個分號而已. 例如 :
    ;此行是註解
    $string=";這不是註解, 是字串"
  2. 段落註解 :
    若註解超過一行, 則可以用 #cs 與 #ce包圍起來, 例如 :
    #cs
    這是段落註解
    #ce
三. 敘述 :
  1. AutoIt 的敘述以跳行為結束. 
  2. AutoIt 敘述若太長時, 可用 “空白+底線” (“ _”) 表示跨到下一行繼續. 例如 :
    $Str=“蘋果 iPad2 _
             iPod and Itune”
    ** 注意, 底線後面不可再加任何註解, 否則會執行錯誤. 
四. 資料類型 :

      AutoIt 有五種資料類型, 但因為是弱型態語言, 所以宣告變數時不用宣告型態 :
  1. 數值 :
    (1). 10進位數值 : 整數例如 123, -123, 實數例如 1.23, -1.23, 1.23e5 (科學表示法)
    (2). 16進位數值 : 以前綴 0x 為首, 例如 0x1cf, 0x236b (最大只能表示 32 位元之整數)
    (3). 檢查變數是否為數值可呼叫函式 IsNumber(), IsInt(), IsFloat()
  2. 字串 :
    (1). 字串內容必須用單引號或雙引號括起來, 例如 : ‘Hello’ 或 “Hello”
    (2). 字串內容含有引號時, 必須使用混合使用單引號與雙引號, 例如 : “I am ‘smart’”
    (3). 字串與數值做數學計算時, 會呼叫 Number() 函數將文字轉成數值, 若其內含有非數值
           字元, 則將傳回0進行計算. 例如 10 * “abc3” -> 0 而 10* “3” -> 30
    (4). 檢查變數是否為字串可呼叫函式 IsString()
    (5). 字串的串接使用 & 符號
  3. 布林值 :
    (1). 布林值只有兩個 : true 或 false, 例如 : Dim $b1=true, $b2=false
    (2). 布林值通常使用於三個邏輯運算子 : And, Or, 以及 Not, 例如 :
           Dim $b3=$b1 And $b2
    (3). 布林值與數值, 文字混合運算時會以下列規則轉換 :
           a. 布林值與數值做數學計算時 : true -> 1, false -> 0
           b. 布林值與數值做邏輯運算時 : 1 -> true, 其他數值 -> false
           c. 布林值與文字串接時 : true -> “True”, false -> “False” (注意首字母大寫)
    (4). 檢查變數是否為布林值可呼叫函式 IsBool()
  4. 二進位值 :
    (1). 二進位值可以呼叫 Binary() 函式取得, 顯示其值時會以16進位數值表示
          例如 : $bin=Binary(“abc”) -> 0x616263
    (2). 檢查變數是否為二進位值可呼叫函式 IsBinary() 
  5. 指標 (pointer) :
    (1). 指標是一個記憶體位址, 例如呼叫 WinGetHandle() 函式時就會傳回指定視窗之控制碼
    (2). 指標值大小依 AutoIt32 或 AutoIt64 分為 32/64 位元

五. 常數與變數 ($ 號) :
  1. AutoIt的常數與變數都以 $ 開頭, 不區分大小寫, 所以 $VAR 與 $var 是一樣的
  2. 常數或變數名稱只能使用字母, 數字, 以及底線 (可以用數字開頭, 常數名稱建議用大寫)
  3. 常數要用 Const 關鍵字宣告, 且其值不可更改, 否則執行錯誤. 例如
    Global Const $PI=3.14159
    ** 使用 Const 就是為了避免數值不小心被改變 (因重複宣告同名變數)
    ** 常數不能重複宣告, 否則執行錯誤 (變數是可以重複宣告的)
  4. 變數應該用 Dim/Local/Global 三個關鍵字宣告其有效範圍 (scope) :
    Dim : 宣告之變數如果在全域範圍中不存在, 那麼就是 Local; 否則就是 Global
    Local : 強制宣告變數之有效範圍為 Local
    Global : 強制宣告變數之有效範圍為 Global (即使在函數內宣告)
    ** 建議明確使用 Local/Global 宣告有效範圍, 不要使用 Dim 讓直譯器判斷
    ** 如果沒有使用 Dim/Local/Global 修飾詞, 則必須在宣告之同時賦值, 否則執行錯誤.
    ** 未宣告修飾詞之變數, 在程式最外層預設為 Global; 在函式或 If/For/While 等結構內為Local
  5. 變數可以先宣告再賦值, 也可以宣告同時賦值, 多個變數可以同時在一行宣告並賦值 :
    Dim $a         ;宣告變數 (一定要有修飾詞)
    $a=1           ;先宣告再賦值
    Dim $a=1       ;宣告同時賦值
    Dim $a, $b, $c   ;同一行宣告多個變數 (一定要有修飾詞)
    Dim $a=1, $b, $c=3   ;同時宣告多個變數並賦值 (一定要有修飾詞)
    注意, 下列指令會有執行錯誤 :
    $a=1, $b=2, $c=3  (沒有加修飾詞)
    $a              (沒有加修飾詞)
  6. AutoIt與Javascript一樣屬於弱型態語言, 變數之資料型別於賦值時決定, 且可以隨時更換.
    Local $x= “abc”  ;宣告 $x 為字串, 存入 “abc”
    $x=123         ; $x 因賦值為123而變成數值

六. 運算子 :

AutoIt 共有 22 個運算子, 分為 5 類 :
  1. 算術運算子 :
    算術運算子共有 + - * / ^ 共五個, 特殊之處是 AutoIt 納入了乘方 (冪次) 運算子 ^, 例如 :
    MsgBox(0,"乘冪",2^10) ; => 輸出 1024
    算術運算子共有 + - * / ^ 共五個, 特殊之處是 AutoIt 納入了乘方 (冪次) 運算子 ^, 例如 : MsgBox(0,"乘冪",2^10) ; => 輸出 1024
    除以 0 會得到 1.#INF (無窮大), 例如 :
    MsgBox(0,"除以零",2/0) ; => 輸出 1.#INF
    運算結果若為大於 1 之無窮小數, 則會取小數點後若干位數使得整數位數 + 小數位數=15 位數, 例如 :
    12/7 => 1.71428571428571; 120/7 => 17.1428571428571
    運算結果若為小於 1 之無窮小數, 則會取小數點後 15 位數, 例如 :
    2/7 => 0.285714285714286
    對於其他較複雜之數學運算, AutoIt 使用數學函式來處理.
  2. 文字串接運算子 :
    AutoIt 使用 & 運算符來串接字串, 例如 :
    "This book is " & "mine" -> "This book is mine"
    當字串與數字串接時, 數字會被轉換成文字再串接, 例如 :
    "$" & 120 -> "$120"
  3. 指派運算子 :
    指派運算子有6個, 除了 = 之外, 再加上與四則運算以及文字串接運算子結合者 :
    =, +=, -=, *=, /=, &=
    結合指派運算子的左邊運算元必須為變數, 右方運算元可以為常數或變數. 將左右兩運算元運算後之結果再指派給左方運算元變數, 例如 :
    Local $x += $y  ;將 $x 與 $y 相加之和再指派給 $x
  4. 比較運算子 :
    比較運算子共有 7 個 :  > < >= <= == = <> (不等於), 其運算結果為布林值 true/false
    比較特殊的是, AutoIt 有兩個相等比較運算子 :  =  (不分大小寫)  == (區分大小寫), 只在英文字串比較時有差別. 例如 : 
    $str= “ABC”
    If $str= “abc” Then -> 結果為 true
    If $str== “aBC” Then -> 結果為 false
  5. 邏輯運算子 :
    邏輯運算子只有 3 個 : AND, OR, NOT 用於布林運算元.
    如果要用到 XOR 運算, 必須使用 ((NOT $A) AND $B) OR ($A AND (NOT $B)) 等效式
運算子的優先順序 : 運算式依下列順序執行, 但可以利用小括號改變順序 :
  1. NOT (邏輯否定)  
  2. ^ (冪次)  
  3. * / (乘除)  
  4. + - (加減)  
  5. & (字串串接) 
  6. < > <= >= = <> == (比較)  
  7. AND OR (邏輯且/或, 且先於或)

七. 程式除錯 :  

程式開發階段常需要讀取輸入或輸出變數來偵錯 :
  1. 變數輸出 :
    執行過程中常要輸出變數值, 以檢驗演算結果是否正確 :
    輸出到 SciTE 底下的 Console :
    ConsoleWrite("$Str=" & $Str & @CRLF)    ;寫入STDOUT (不會跳行)
    輸出到 MsgBox :
    MsgBox(0, "標題", $Str)                 ;寫入圖形介面
    輸出陣列變數可匯入使用者定義函式庫 Array.au3 後呼叫 _ArrayDisplay() :
    #include <Array.au3>
    Local $a[3]=[1,2,3]
    _ArrayDisplay($a, "陣列內容")
  2. 讀取輸入 :
    從 STDIN 讀取輸入 : ConsoleRead 必須放在迴圈中, 且必須編譯成 .exe
    Local $data
    While True
         $data &= ConsoleRead()
         If @error Then ExitLoop
    WEnd
    從 InputBox 讀取輸入 :
    $ID=InputBox("標題", "提示語")
          ** ConsoleWrite 與 ConsoleRead 屬於內建函數 (File/Directory/Disk)


2012年7月19日 星期四

完成 AutoIt 的剖析函式庫

這幾天因為要教二哥 Javascript 關係, 所以大部分時間都在複習我這個老把戲, 老歸老, 在 HTML5 時代它將發光發亮, 更何況 Node.js 又將它進一步推向後端伺服器應用, 更不用說 jQuery 給它帶來的無比榮耀了.
而公司專案部份, 剩下 hubbing 了, 但是因為 JS 作為大量資料處理似乎效能不夠好, 我考慮回來用 AutoIt 改寫, 看看二進位執行檔效能可以有多好. 但在此之前得先造好輪子, 所以這週都在寫 AutoIt 的剖析函式庫, 難免又要重新復習一下字串操作與難纏的正規表示法. 真的一陣子沒摸, 連基本語法都忘了. 所幸, 靠著平日認真整理密笈, 只要稍作複習功力馬上回復, 今天週四了, 嘿, 四天搞定 parse.au3. 下一步, 重新修改 access.au3 改成 WSH 那個模樣就 OK 拉.

2011年7月19日 星期二

AutoIt 的 FTP 功能

今天終於將 AUTOIT 的 FTP 功能搞清楚了, 因為公司有一項專案, 要求外部單位將 txt 檔以 ftp 方式傳送檔案至指定伺服器, 然後我得寫個程式定時, 例如每五分鐘去 ftp 查看看是否檔案已傳入, 是的話就下載該檔案, 讀取內容後, 自動對系統下達命令. 這種自動化我很有興趣, 但上司擔心搶走我們人工的工作, 所以可以做不能說. 以去 hinet 的 myweb FTP 網站取得網頁為例, 程式如下 (用到 FTPEX.AU3)
    #Include "FTPEX.AU3"
    $server = "ftp.myweb.hinet.net"
    $username = "xyz"
    $password = "123456"
    $Open_FTP = _FTP_Open('Hinet_FTP')
    $FTP_Conn = _FTP_Connect($Open_FTP, $server, $username, $password)
    $ThisLocation = "D:\FTP\download.htm"
        $RemoteLocation = "/download.htm"
    $getFile = _FTP_FileGet($FTP_Conn, $RemoteLocation, $ThisLocation)
    If $getFile = 1 Then
MsgBox(48,"提示訊息", "下載完成")
    EndIf
    _FTP_Close($Open_FTP)

2011年3月30日 星期三

AutoIt 的雜湊函式庫

AutoIt 內建正規表示法, 但卻沒有雜湊資料結構, 實在是美中不足. 若加上雜湊, 就可與 Perl 一樣具有超強文字處理能力了. 我找到了這個雜湊的自訂函式庫, 要試用看看好不好用.

>> http://www.autoitx.com/viewthread.php?tid=19060
>> http://www.autoitscript.com/forum/topic/11611-hash-table-udf/ (雜湊函式庫下載)

練功進度

最近集中精力於 AutoIt 操典之整理, 已將字串, 檔案, 資料庫操作整理完畢, 正規表示法也快完成, 下一步就是 IE 操控與網路函數, 如此即大功告成矣.

2010年8月12日 星期四

關於 SciTE4AU3 之木馬病毒

最近新裝電腦, 安裝 AutoIt 時利用 TotalVirus 去掃 SciTE4AU3, 發現有 11/41 之木馬, 再掃描安裝後之 SciTE 目錄下之檔案, 發現 C:\Program Files\AutoIt3\SciTE\AutoItMacroGenerator 底下的 TheHook.dll 貢獻了 12/42 :

BitDefender 7.2 2010.08.05 Application.Keyhook.DLS
Comodo 5653 2010.08.05 Application.Win32.Monitor.Hooker.~A
Emsisoft 5.0.0.36 2010.08.05 Riskware.Monitor.Win32.Hooker.s!A2
F-Secure 9.0.15370.0 2010.08.05 Application.Keyhook.DLS
Fortinet 4.1.143.0 2010.08.05 Keylog/Hooker
GData 21 2010.08.05 Application.Keyhook.DLS
Kaspersky 7.0.0.125 2010.08.05 not-a-virus:Monitor.Win32.Hooker.s
nProtect 2010-08-05.01 2010.08.05 Application.Keyhook.DLS
Sunbelt 6688 2010.08.05 Monitoring-Tool.Win32.Hooker
TheHacker 6.5.2.1.332 2010.08.05 Aplicacion/Hooker.s

C:\Program Files\AutoIt3\SciTE\SciTEConfig 底下的 SciteConfig.exe 則貢獻了 1/41
Jiangmin 13.0.900 2010.05.11 Trojan/Refroso.hht

C:\Program Files\AutoIt3\SciTE\cSnippet 下的 CSnippet.exe 則貢獻了 1/41
TheHacker 6.5.2.0.302 2010.06.20 Trojan/Dropper.gen

C:\Program Files\AutoIt3\SciTE\CodeWizard 下的 CodeWizard.exe 則貢獻了 1/41
McAfee-GW-Edition 2010.1 2010.06.30 Heuristic.BehavesLike.Win32.Packed.A

C:\Program Files\AutoIt3\SciTE\FuncPopUp 下的 FuncPopUp.exe 則貢獻了 1/41
Rising 22.34.01.03 2010.02.11 Packer.Win32.Agent.bk

C:\Program Files\AutoIt3\SciTE\Koda 下的 FD.exe 則貢獻了 1/41
McAfee-GW-Edition 2010.1 2010.07.02 Heuristic.BehavesLike.Win32.ModifiedUPX.F!87

在 COMODO 論壇上也有討論 SciTE 的 KEYLOGGER 問題 :
http://webcache.googleusercontent.com/search?q=cache:am9SJ56eDe8J:forums.comodo.com/av-false-positivenegative-detection-reporting/false-positive-thehookdll-in-scite-for-autoit-unclassified-malwareat4226609-t34316.0.html+SCITE+VIRUSTOTAL&cd=5&hl=zh-TW&ct=clnk&gl=tw

我是覺得, 如果比率很低, VirusTotal 的結果當作參考即可.

2010年1月14日 星期四

403forbidden

這位 403forbidden 的部落格式我在找尋 AutoIt 教學文件時找到的, 這小姐錄製了十幾集 AutoIt 的 mp4 教學, 還有許多有趣的文章, 例如 how to boot Ubuntu from USB, 以及用 AutoIt 所寫的 AES 高級密碼演算法程式.

HTML clipboard
>> 403forbidden
的 AutoIt 教學 mp4 下載


2010年1月4日 星期一

工作自動化

最近忙著研究如何利用 autoit 來讓日常的例行工作自動化, 節省更多時間來做規劃與學習. 搞電腦這麼久了, 越來越覺得被電腦所奴役, 奇怪咧! 電腦不是要幫我們服務, 節省時間的嗎? 現在資訊系統越來越多, GUI 介面操作起來還是得花許多時間, 變成形役於物, 越電腦化工作反而越來越多, 何也? 現在對 AUTOIT 寄望甚殷, 或許以後可以不用 JAVA 寫自動化, 用 AUTOIT 就搞定了!

2009年12月2日 星期三

autoIt 與電腦化自動下單

這也是在 Reflection 布洛格看到的有趣文章. 這個 autoIt 看起來蠻好用, 可以模仿人類在 gui 介面的動作, 可以代替我們完成許多自動化工作, 有空好好研究.

>> 免費的電腦化自動下單方法