制御フロー

If

if (expression)
if (expression)

expressionが空文字列でも数値の0でもないときにtrueと評価され、続く行またはブロックが実行されます。

コマンドが1つならば、次の行にそれを記述します。

if (expression)
    command1

同一行に、if(expression) command1のようには記述できません。

コマンドが複数ならばかっこで囲み、次のようにします。

if (expression)
{
    command1
    command2
}

Ifコマンド

真偽値を返す関数を呼び出す場合には、かっこを省略してIfコマンドとして記述できます。

if IsDone ; (IsDone)ではない
{
    ...
}

この形式のときは、右辺は既定で文字列として解釈されます。よって変数aと変数bを比較するには、

if a = %b%

のように、右辺のみを%で囲みます。また文字列と比較するときIf式では

if( a = "ABC" )

のようにダブルクォーテーションで囲むのに対し、Ifコマンドでは囲みません。

if a = ABC

コマンド形式

演算子のほかに、専用のコマンドを使用する形式もあります。コマンド形式の場合には、真 (true) のときに実行するコマンドをカンマで区切って記述します。

コマンドと演算子との対応
意味 コマンド形式 等価な演算子
等値
IfEqual, var, value
if var = value
等値
(大文字/小文字を区別する)
なし
if var == value
非等値
IfNotEqual, var, value
if var != value
if var <> value
大なり
IfGreater, var, value
if var > value
小なり
IfLess, var, value
if var < value
以上
IfGreaterOrEqual, var, value
if var >= value
以下
IfLessOrEqual, var, value
if var <= value
If/IfEqual/IfNotEqual/IfLess/IfLessOrEqual/IfGreater/IfGreaterOrEqual

この形式では最初のパラメータは、つねに変数として解釈されます。このことから0、1、2…はスクリプト プロパティとみなされるため、記述の順に注意が必要です。

特殊な比較分岐

空文字列との比較

右辺に何も記述しないと、空文字列との比較となります。

if a =

または!演算子を使用して、

if !a

としても同じです。

変数に含まれる文字列との比較 (IfInString)
IfInString, var, SearchString
IfInString / IfNotInString
var := "Apple"
key := "P"

IfInString, var, %key%
{
    ; 一致した場合の処理
}

StringCaseSenseでOnと指定しない限り、文字列の比較で大文字/小文字は区別されません

逆に一致しない場合を想定するならば、IfNotInStringを用います。

IfNotInString, var, SearchString

また一致する位置も重要ならば、StringGetPosを用います。

変数の範囲を比較 (between)
If var [not] between LowerBound and UpperBound
変数の型を比較 (is)
If var is [not] type
複数の変数を一括して比較 (in, contains)
If var [not] in value1,value2,...
If var [not] contains value1,value2,...

value1value2...のいずれかに一致したときに結果が真となります。その比較はすべて、文字列として比較されます。"contains"演算子による比較は、IfInStringコマンドのそれと同一です。If var [not] in/contains value1,value2,...

カンマの前後のスペースとタブも文字列の一部とみなされ、比較対象となります。

指定ウィンドウがアクティブかどうかで分岐
IfWinActive [, WinTitle, WinText,  ExcludeTitle, ExcludeText]
IfWinNotActive [, WinTitle, WinText, ExcludeTitle, ExcludeText]
指定ウィンドウが存在するかどうかで分岐
IfWinExist [, WinTitle, WinText,  ExcludeTitle, ExcludeText]
IfWinNotExist [, WinTitle, WinText, ExcludeTitle, ExcludeText]

Else

Else
Else

elseは同一行にある他のコマンドも評価するため、"else if"の構文 (if-else-if ladders) も記述できます。

if( a < 0 )
{
    ...
}
else if( b < 0 )
{
    ...
}
else
{
    ...
}

elseは、ifコマンド以外にも適用できます。

IfInString, str, sample
{
    ...
}
else
{
    ...
}

短絡評価 (Short-circuit Boolean Evaluation)

短絡評価がサポートされるため、次のような構文が可能です。Short-circuit Boolean Evaluation - Functions

if( ColorName <> "" AND not FindColor( ColorName ) )
    MsgBox %ColorName% could not be found.

Switch

Switch [SwitchValue]
{
Case CaseValue1:
    Statements1
Case CaseValue2a, CaseValue2b:
    Statements2
Default:
    Statements3
}
Switch

v1.1.29以降でサポートされます。

Loop

Loop [, Count]
Loop

Count回数またはbreakに出会うまでループをくり返します。

Loop
{
    ; くり返す処理
    break
}

Loop, 10
{
    ; くり返す処理
}

キー入力をくり返すだけならばこれを用いる必要はなく、Sendで対応できます。

通常は処理が完了するまでループがくり返されますが、これを中断できるようにするにはGetKeyStateなどで入力を監視して、breakでループを抜けます。

Loop, 10
{
    SoundBeep
    Sleep, 100

    GetKeyState, state, Escape
    if( state = "D" )
        break
}
パラメータ 機能  
Files 複数のファイルまたはフォルダから、パターンに一致するファイルの情報を1つずつ取得できる Loop (files & folders)
Parse 文字列から、部分文字列を1つずつ Loop (parse a string)
Read テキストファイルから、1行ずつ Loop (read file contents)
Reg レジストリから、キーを1つずつ Loop (registry)

Break

Loopから抜けます。これはLoop内でのみ有効です。

Break [, LoopLabel]
Break

Loopがネストされているときには、LoopLabelで適用対象のLoopを指定できます。LoopLabelはLoopに付けられたラベル、もしくはネストレベルを表す数値で指定します。

Continue

Continue [, LoopLabel]
Continue

For-loop

For Key [, Value] in Expression
For-loop

Expressionのオブジェクトの数だけ、それをKeyValueに値を格納しながらくり返します。

array := {"A":10, "B":20}

for k, v in array
    MsgBox, % k v ; A10, B20 と出力

While-loop

While Expression
While-loop

Goto

指定されたラベルへジャンプし、実行を継続します。

Goto, Label
Goto

Gosubと異なりreturnから制御が戻らないため、Gotoに後続する文は実行されません。

Goto, Label1
; ここは処理されない


Label1:
    ...
return

Gosub

Gosub, Label
Gosub

指定されたラベルの行へジャンプし、returnまで処理を実行します。

Label1: ; ラベル
    ...
return

^a:: ; ホットキーラベル
    ...
return
Gosub, Label1 ; ラベルでの呼び出し
Gosub, ^a     ; ホットキーラベルでの呼び出し

Return

Return [, Expression]
Return

サブルーチンから戻ります。

サブルーチンからの呼び出しではないときは、代わりにExitが実行されます。

Throw

Throw [, Expression]
Throw

Throwした例外をtry-catchで捕捉しないと、エラーのダイアログが表示され、実行中のスレッドが終了します。

Try、Catch

Try
{
    Statements
}
Catch [, OutputVar]
{
    Statements
}
Try Catch
try
    throw "TEST"
catch e
    MsgBox, % e ; "TEST"

Try、Catchは実行時エラーも捕捉できます。この実行時エラーには2種類あり、ErrorLevelを設定するものと、エラーメッセージを表示してスレッドを抜けるものです。

Sleep

指定時間が経過するまで、次の処理を待機させます。

Sleep, DelayInMilliseconds
Sleep

待機させる時間を、DelayInMillisecondsでミリ秒で指定します。指定可能な範囲は0 ~ 2,147,483,647 (2³¹ - 1) で、最長でおよそ24日間です。

以下の値は特別な意味を持ちます。

  • -1 … 待機せず、メッセージ キューを確認する
  • 0 …
  • 1 ~ 10 … 10か10.6を指定するのに等しい

Sleepによる待機中も、ホットキーなどによる他のスレッドの起動ができます。

SetTimer

一定時間ごとに、特定のサブルーチンをくり返し実行させます。

SetTimer
    [, Label,  ; 実行するサブルーチンのラベル
    Period|On|Off,
    Priority ] ; タイマーのスレッド優先度。-2147483648~2147483647の値
SetTimer
パラメータ 機能
Period 実行周期。単位はミリ秒で、4294967295以下の整数。未指定の場合の既定値は250
On タイマーを再開する。まだ開始していない場合は、既定の周期 (250ミリ秒) で開始する
Off タイマーを停止する。

処理を1回だけ実行させるには、呼び出されたルーチンでタイマーを停止させます。

A::
    SetTimer, Label1, 100 ; 100ミリ秒後に呼び出し
return

Label1:
    SetTimer, Label1, Off ; タイマーを停止
    ; 何らかの処理
return

Exit

Exit [, ExitCode]
Exit

現在のスレッドを終了させます。スクリプトがPersistentではなく、ホットキーも含まないときにはスクリプト全体を終了させます。無条件にスクリプト全体を終了させるにはExitAppコマンドを使用します。

ExitApp

ExitApp [, ExitCode]
ExitApp

無条件にスクリプトを終了させます。