FileSelectFileの複数選択がクソ
なにがクソって、わざわざディレクトリパスとファイル名に分割して出力しやがるところが。
複数のファイルが選択された場合、改行(`n)区切りで列挙される。
その場合、1行目はファイルのあるディレクトリになり、残りはディレクトリパスを含まないファイル名になる。
そのため、複数選択してループ処理とかしようとした時に、素直に処理できない。
いったいなんのためにそんな謎仕様にしたのか本気で理解できないんだけど、まあ仕様ならしょうがないのでなんとかしよう。
オプションは4ではなくMにする
なお、Optionsで Mを使わずに 4で複数選択にした場合、ひとつしか選択しなかったときはフルパスが1行に格納されるようになる。
オプションで4
またはM
を選択することでファイルの複数選択が可能になるが、4
の場合にはファイルが1個の場合と2個以上の場合で分岐処理が必要になる。
それはやってられないので、どうせならM
を選択すべき。
Loop,Parseで1回目だけ処理を変える
Loop,Parse
コマンドで、デリミタを `n
にすることで、FIleSelectFile
で取得した各ファイルに対して処理を行うことができる。
M
オプションを選択した場合、 `n
で区切られる1つ目のフィールドがディレクトリパスであり、以降がファイル名であることは確定している。
よって、1回目のループだけ例外にして、2回目以降は同じ処理をすればいい。
例えば、以下は選択したファイルを削除するスクリプトである。
FileSelectFile, SelectedFiles, M, , 削除するファイルを選択,
If ErrorLevel = 1 ; ファイルを選択せずダイアログを閉じた場合
{
MsgBox, , , ファイルが選択されていません
Exit
}
Loop, Parse, SelectedFiles ,`n
{
If A_Index = 1 ; ループが1回めなら
SetWorkingDir, %A_LoopField% ; 作業ディレクトリを選択したファイルの親ディレクトリに変更
; Dir = %A_LoopField% ; または、ディレクトリパスを変数に格納
Else
FileDelete, %A_LoopField% ; 作業ディレクトリ内の対象ファイルを削除
; FileDelete, %Dir%\%A_LoopField% ; または、フルパスを指定して削除
}
実行したい処理の内容によるが、基本的には、ループ1回目で作業ディレクトリを変更する、またはディレクトリパスを変数に格納する。
そのままループ内で順次処理を実行してもいいし、改めてフルパスを変数に格納した上で、次の処理に引き渡してもいいだろう。