こんにちは、生焼けです。
今回は、AutoHotkeyで条件に当てはまるファイルを探す時に便利なLoopコマンドについて解説していきます。
キーの指定(^+r:: など)は省略しています。
AutoHotkeyのついての記事はこちら
Loopコマンドとは?
条件にあったファイル全てに動作をさせられる!
このAutoHotkeyのファイル操作の記事でも触れましたが、Loopコマンドは条件にあったファイルを探し、その1つ1つに動作を行わせることができるという便利なコマンドです。
例えば、あるフォルダに入ったテキストファイル全てになにかを動作させたい…といった場合に使います。
書き方を簡単に書くと、下のような感じです。
Loop,動作させたいファイルの条件
{
動作
}
return
ワイルドカードを利用して検索する
ファイルの検索にはワイルドカードを利用します。
ワイルドカードとは?
「ワイルドカード」とは、なんの文字にでも置き換えられる記号…みたいなもののことです。
2種類あり、0文字以上の文字を表す「*」と1文字のみを表す「?」があります。
「*」の場合
*.txt
で、ファイル名に関わらず「.txt」が拡張子のもの全てを表すことができます。
「?」の場合
tamesi.???
でファイル名が「tamesi」で”jpg”など拡張子が3文字ぴったりのものを表すことができます。
このワイルドカード「*」を用いて、
Loop,D:\folderA\*.txt
{
MsgBox,テキストファイルがありました。
}
とすると、folderAにあるテキストファイルの個数分「テキストファイルがありました。」と表示されます。
つまり、folderAにあるテキストファイルが5つあった場合、5回「テキストファイルがありました。」と表示されるということです。
フォルダを探す場合
デフォルトでは、ファイルのみを探すようになっています。
ファイルとフォルダどちらも探す場合は「,1」、フォルダだけを探す場合は「,2」を最後につけます。
Loop,D:\folderA,2
{
MsgBox,folderAがあったよ!
}
return
サブフォルダも検索する
デフォルトでは、指定したフォルダのみ検索されます。
指定したフォルダ以下(サブフォルダ)も検索に含める場合は「,,1」を最後につけます。フォルダを探す場合は「,2,1」と書きます。
Loop,D:\folderA\*.jpg,,1
{
MsgBox,%A_LoopFileFullPath%
}
return
とした場合、folderAの中だけでなく、folderA以下にあるフォルダの中も含めてjpgが検索されます。
組み込み変数
上に書いたことだけでも便利なんですが、なんとLoopコマンドでは取得したファイルのファイル名やパスなどの情報を変数として取得することができます。
変数とは(イメージ)
頭の中に赤いマグカップを思い浮かべてください。
その中に水を注ぎます。一旦水を捨て、今度はオレンジジュースを入れます。ジュースを全部飲み干し、次はコーヒーを注ぎます。
「じゃあ、今その赤いマグカップの中身は何が入っていますか?」と聞かれたら、もちろん「コーヒー」と答えますよね。
この「赤いマグカップ」の役割が変数に似ています。
つまり、変数とは中身を変えられる、文字や数字などを入れるための名前のついた容器のようなもの、みたいな感じだと思ってください。
AutoHotkeyでの変数の書き方
AutoHotkeyの書き方で変数の中に中身を入れるには、
;変数名 = 中身
hensuu = nakami
hensuu1 = 1
のように書きます。(他の言語とは違い、文字列でも基本””などはいらない)
変数を展開(中身を表示)するには%hensuu%のように変数名の前後に%をつけます。
赤いマグカップに起こったことを表すと、下記のようになります。
redcup = water
redcup = orangejuice
redcup = coffee
MsgBox,%redcup%
;最後に入れたcoffeeが表示されます
Loopコマンドで取得したファイルの情報は、あらかじめAutoHotkey側で用意された変数(組み込み変数)に入ります。
この変数を利用すれば、条件に当てはまるファイル1つ1つのファイル名を取得する…なんてこともできます。
どんなふうに使うのか
例えば、folderAにある全てのテキストファイルのファイル名を取得したい時。
Loopコマンドでファイル名が格納される変数の名前は”A_LoopFileName”なのでこれを使います。
先程も言った通り、変数を展開(中身を表示)するには”%A_LoopFileName%”のように変数の前後に%を付ける必要があります。
なので、それぞれのファイル名を表示させたい場合は
Loop,D:\folderA\*.txt
{
MsgBox,%A_LoopFileName%
}
return
のように書きます。
これを動かした場合、folderAに下の3つのテキストファイルがあったとすると
- D:\folderA\mituketa.txt
- D:\folderA\sagasita.txt
- D:\folderA\sottiniikuyo.txt
「mituketa.txt」「sagasita.txt」「sottiniikuyo.txt」と計3回メッセージが表示されます。
主な変数
組み込み変数はこのWikiのLoopコマンドのページに書いてある通り色々ありますが、ここではよく使うであろうものをご紹介します。
例:“2020年7月18日14時50分30秒”に作成され、“2020年7月20日14時50分30秒”に更新された“D:\folderA\mituketa.txt”というファイルがあるとすると、取得される情報は以下のようなものになります。
変数名 | 中身 | 例 |
A_LoopFileName | ファイル名 | mituketa.txt |
A_LoopFileExt | 拡張子 | txt |
A_LoopFileFullPath | フルパス | D:\folderA\mituketa.txt |
A_LoopFileTimeModified | 更新日時 | 20200720145030 |
A_LoopFileTimeCreated | 作成日時 | 20200718145030 |
A_LoopFileName/ファイル名の取得
“mituketa.txt”のようにファイルの名前+拡張子を取得します。
Loop,D:\folderA\*.txt
{
MsgBox,ファイル名は%A_LoopFileName%
}
return
A_LoopFileExt/拡張子の取得
“txt” のように拡張子のみを取得します。
Loop,D:\folderA\*.txt
{
MsgBox,拡張子は%A_LoopFileExt%
}
return
A_LoopFileFullPath/フルパスの取得
“D:\folderA\mituketa.txt”のようにフルパスを取得します。
Loop,D:\folderA\*.txt
{
MsgBox,フルパスは%A_LoopFileExt%
}
return
ファイルのフルパスを取得した場合、SplitPathを使ってパスを分解することも出来ますがその解説は長くなるので、また今度。
WikiのSplitPathのページ
A_LoopFileTimeModified/更新日時の取得
“20200720145030”のようにファイルの更新日時がYYYYMMDDHH24MISS形式で取得されます。
Loop,D:\folderA\*.txt
{
MsgBox,更新日時は%A_LoopFileTimeModified%
}
return
このままでは使いづらいのでFormatTimeコマンドなどを使用して、体裁を整えるのがオススメです。
Loop,D:\folderA\*.txt
{
FormatTime, TimeString, %A_LoopFileTimeModified%, yyyy年MMMMdd日dddd,hh:mm:ss tt
MsgBox,%TimeString%
;例 20200720145030→ 2020年7月20日,02:50:30 午後 と表示される
}
return
WikiのFormatTimeのページ
A_LoopFileTimeCreated/作成日時の取得
“20200718145030”のようにファイルの作成日時がYYYYMMDDHH24MISS形式で取得されます。
Loop,D:\folderA\*.txt
{
FormatTime, TimeString, %A_LoopFileTimeModified%, MMMMd日tth時
;例 20200718145030→7月18日午後2時 と表示される
MsgBox,作成日時は%TimeString%です
}
return
こちらも更新日時と同様にFormatTimeコマンドと一緒に使うのをおすすめします。
検索を途中でやめる
ループを止めるbreak
検索を止めたいときは、”break”を使います。
“break”を使えばあるファイルが検索にひっかかったときに検索をやめる、といったことが出来ます。
例えば、“mituketa.txt”が見つかったら検索をやめたい場合は
Loop,D:\folderA\*
if A_LoopFileName = mituketa.txt
{
MsgBox,%A_LoopFileName%があったので終了します。
break
}
else
{
MsgBox,%A_LoopFileName%なので続けます。
}
}
return
のように書きます。
まとめてきな
今回はファイル検索に便利なLoopコマンドについて紹介しました。
複数のファイルについて操作したいときや、検索したファイルの情報を取得したい時などに使えます。
関連記事
参考記事