基本
Ahk2Exe.exeでコンパイルしたスクリプトは、コマンドライン引数を受け取った場合、変数%1%
~%n%
に格納する。変数%0%
には引数の数を格納する。
AutoHotKey 1.1.27 以降では、組み込み変数A_Arg
から引数にアクセスできる。
これは配列オブジェクトであり、例えばA_Arg[1]
には1つ目の引数が格納されている。
数値を変数名とする変数の扱い
扱いは通常の変数と同様であるが、これに限らず数値を変数名とする変数は、式中で参照することができない。
以下しばらく、コンパイルしてないスクリプトで数字を変数名とする変数を扱う場合。
1 = abc
var := 1 . "def" ; 式で文字列を連結する
MsgBox, , %A_scriptname%, %var%
; 「1def」と表示される
このように、式中では数値は変数名ではなくただ数値として扱われる。
these variables cannot be referenced directly in an expression because they would be seen as numbers rather than variables.というわけである。
↑の例であれば、右側を式の代入ではなく、変数を含む文字列にすればよい。
1 = abc
var = %1%def
MsgBox, , %A_scriptname%, %var%
; 「abcdef」と表示される
どうしても式中で参照する必要がある場合(例えば関数のパラメータ)、別名の変数に格納する必要がある。
1 = abcdef
1p = %1%
F_MsgBox(1)
; 「1」と表示される
F_MsgBox(1p)
; 「abcdef」と表示される
F_MsgBox(msg) ; パラメータの文字列を表示する関数
{
MsgBox, , %A_scriptname%, %msg%
}
A_Argsさいこうすぎる
そんな面倒はA_Args
にはないのでとっととアップデートしてとっとと配列覚えましょう。
引数のループ処理
以下は、引数の有無を判定した上でループ処理する例。
If (A_Args.length() > 0) ; 引数が1個以上ある場合
{
For index, Target in A_Args ; 引数をループ処理
{
If FIleExist(Target)
Run, %Target%
}
}
フラグ処理を加える例
readme.mdっぽく書くとsample.exe [/flag_a] [arguments]
みたいな、コマンドラインスイッチがありつつ複数のパラメータも取れるスクリプトを書く場合。
flag_del = 0
If (A_Args.length() > 0) ; 引数があったら
{
If (A_Args[1] = "/del")
{
flag_del = 1
A_Args.remove(1) ; 第1パラメータを削除し配列をシフト
}
If (A_Args.length() > 0) ; まだ引数があったら
{
For index, Par in A_Args ; パラメータをループ処理
{
If FIleExist(Par)
If (flag_del = 0)
Run, %Par%
Else
FileDelete, %Par%
}
}
}
まあだいたいこれを基本にしていじればなんとかなる。
ただし
配列オブジェクトは、雑な言い方だが式中でしか参照できないのがちょっと扱いづらさは感じる。
AutoHotKeyの配列は配列オブジェクトであって配列変数ではない。変数ではないので変数として参照はできない。
変数として参照できないので、そのままでは値として扱うことができない。ということになる。
例えばA_Args[1]
を表示したいだけなんだよなー!というとき、MsgBox, , %A_scriptname%, %A_Args[1]%
とかMsgBox, , %A_scriptname%, %A_Args%[1]
とかやってもダメ。
正しくはこう。(参照:式 - AutoHotkey Wiki)
MsgBox, , %A_scriptname%, % A_Args[1]
なんかなーうーんなんかなー!
こういう場面ではLegacyな%<数値>%
のほうが簡単ではある。両方使うと混乱するから、配列の方に統一したけど。