1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[AutoHotKey]FileSelectFileの複数選択がクソなのでなんとかする

Posted at

FileSelectFileの複数選択がクソ

なにがクソって、わざわざディレクトリパスとファイル名に分割して出力しやがるところが。

複数のファイルが選択された場合、改行(`n)区切りで列挙される。
その場合、1行目はファイルのあるディレクトリになり、残りはディレクトリパスを含まないファイル名になる。

FileSelectFile - AutoHotkey Wiki

そのため、複数選択してループ処理とかしようとした時に、素直に処理できない。

いったいなんのためにそんな謎仕様にしたのか本気で理解できないんだけど、まあ仕様ならしょうがないのでなんとかしよう。

オプションは4ではなくMにする

なお、Optionsで Mを使わずに 4で複数選択にした場合、ひとつしか選択しなかったときはフルパスが1行に格納されるようになる。

FileSelectFile - AutoHotkey Wiki

オプションで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回目で作業ディレクトリを変更する、またはディレクトリパスを変数に格納する。

そのままループ内で順次処理を実行してもいいし、改めてフルパスを変数に格納した上で、次の処理に引き渡してもいいだろう。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?