[AHK] ドラッグアンドドロップのファイルパスを簡単に取得する関数
2018/04/07
AutoHotkeyのスクリプト(コンパイルしたEXEファイルを含む)にファイルをドラック&ドロップすると、スクリプトからそのファイルパスを取得することができます。
ただ、毎回その書き方にしたがって処理するのが面倒! なので簡単にする関数を作りました。
8.3形式を無効にしていて空白をちゃんと処理できない場合にも対応しています。
本来の書き方
本来は、変数「0」「1」「2」…… にドラック&ドロップ(あるいはコマンドライン引数)のデータが代入されます。0, 1, 2… はもちろん数値でもあるので、適切に書いてデータを取り出さないといけません。
argNum = %0% ; ファイルや引数の数 arg1 = %1% ; 1個目の引数 arg2 = %2% ; 2個目の引数
問題点1:全引数を別の変数に入れないといけない
関数にこのデータをそのまま渡すことはできません。
func(1)
なんて書いても、ただの数値「1」が渡されるだけです。
一括で処理する方法がないので、さっきのように全引数を代入しないといけません。引数の数が不定(複数ファイルのD&Dに対応するなど)の場合にはループ処理が必要です。
argNum = %0% Loop, %argNum% { arg%A_Index% := %A_Index% }
問題点2:空白をちゃんと処理できない
こっちはかなり厄介です。ファイルシステムで8.3形式を無効にしている場合、ファイルパスの処理がめちゃくちゃになります。
C:\Program Files (x86)\Apple Software Update\SoftwareUpdate.exe
というファイルを1つだけD&Dした場合はこんなことになります。
argNum = %0% ; 5 arg1 = %1% ; C:\Program arg2 = %2% ; Files arg3 = %3% ; (x86)\Apple arg4 = %4% ; Software arg5 = %5% ; Update\SoftwareUpdate.exe
なんじゃこりゃ!って感じですよね。複数ファイルが渡されたみたいになっています。
これはファイルパスに含まれる空白をちゃんと処理できずに、空白で分けて別々の引数としてしまうために起こる問題です。
8.3形式が有効になっているシステムでは、
argNum = %0% ; 1 arg1 = %1% ; C:\PROGRA~2\APPLES~1\SOFTWA~1.exe
のようになるので問題ありませんが、自分以外も使うソフトであれば、8.3形式が無効になっている場合もちゃんと想定しておかないといけませんね。
D&D処理関数 GetArg()
ドラックアンドドロップされた引数を処理する関数を定義しました。
コマンドプロンプトでファイルパス以外の文字列が渡されることは想定していないので、あくまでドラックアンドドロップ用です。
GetArg() { local fileNum, aArg aArg := [] Loop, %0% { arg := %A_Index% if arg contains : aArg.Insert(arg) else aArg[aArg.MaxIndex()] .= " " arg } return aArg }
解説
ドロップされるのはファイルパスのはずなので、必ず「A:」のようなドライブレターが含まれるはずです。
Windowsではファイル名に「:」を含めることができないので、「:」があればファイルパス、無ければ前のパスの続きとして処理しています。
使い方
スクリプトの最初の方で
aArg := GetArg()
と書けば、配列「aArg」にファイルパスが代入されます。
aArg.MaxIndex()
がドロップされたファイルの数、
aArg[1], aArg[2], ...
が各ファイルパスになります。
print関数を使えば簡単に中身が見られます。
print(aArg)
まとめ
これでドラックアンドドロップを手軽に使えるようになりましたね!