# 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 有下列四種循環結構 :
- For...Next
- For...In...Next
- While...WEnd
- 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)
沒有留言 :
張貼留言