使用するアプリ
-
ポチエス置き場
- esExt5146
-
AutoHotkey
- 1.1.29
コマンドラインパラメータとして、フォルダを含む複数のパスを渡したい場合。
ポチエスが生成するコマンドライン
esExt5.iniでのコマンドラインの指定は、例えば以下のようになる。
test.exeは、Ahk2Exe.exeでコンパイル済みのAutoHotKeyスクリプトだとする。
C:\Apps\test.exe | AHK test
> "%-M"
%M
は、ポチエス自体に複数のファイル/フォルダが渡された場合、それをまとめて展開するマクロ。
-
を付けた場合、フォルダパスが渡された場合に末尾の\
を削除して渡す。
%M
をクォート(シングル''
でもダブル""
でも)で囲むと、ファイル/フォルダのパスそれぞれをクォートする。
つまり、↑の設定の場合、AutoHotKeyスクリプトに渡されるコマンドラインは以下のようになる。
C:\Apps\test.exe "c:\dev\1.txt" "c:\dev\2.txt" "c:\dev\3.txt"
パスにスペースが含まれる場合だけクォートしてくれ、ということはできない。
よっぽど使用範囲が限定されていない限り、常にクォートしたファイル/フォルダのパスを次のアプリに渡すことになる。
この点に、ちょっとだけ注意が必要。
AutoHotKey側パラメータ解釈
以下、AutoHotKeyでのパラメータへのアクセスはA_Args
オブジェクトを用いることとする。
どっちかっていうとコイツのほうが悪いんだけど。
どうもコイツ、いったんパラメータ全体を単一の文字列として受け取った後、分割してA_Args
オブジェクトに格納する、といった処理をやっているっぽい。
どういうことか。さきほどのコマンドラインを見てみよう。
C:\Apps\test.exe "c:\dev\1.txt" "c:\dev\2.txt" "c:\dev\3.txt"
test.exeは、"c:\dev\1.txt" "c:\dev\2.txt" "c:\dev\3.txt"
という文字列をパラメータとして受け取る。
次に、「ダブルクォートで囲まれた部分は一つのパラメータ」「空白文字はパラメータの区切り」であるとして文字列を分割する。
- c:\dev\1.txt
- c:\dev\2.txt
- c:\dev\3.txt
これが、A_Args
オブジェクトにそれぞれ格納される。
- A_Args[1] -> c:\dev\1.txt
- A_Args[2] -> c:\dev\2.txt
- A_Args[3] -> c:\dev\3.txt
と、いうのがまあ、想定される動作だよね。
問題は、個々のパラメータの末尾に\
(バックスラッシュ)が含まれる場合。
AutoHotKeyにおいては、デフォルトのエスケープ文字は `
(バッククォート)なのだが、パラメータの解釈においては\
(バックスラッシュ)もエスケープに使われてしまうようなのだ。たぶん。
ここで、test.exeの中身を、以下のようなループでパラメータを表示するスクリプトにしてみる。
For index, Target in A_Args
{
MsgBox, , %A_scriptname%, %Target%
}
これを、以下のようなコマンドラインで実行したとする。
C:\Apps\test.exe "c:\dev1\" "c:\dev2\a.txt"
C:\Apps\test.exe "c:\dev1\" "c:\dev2\"
前者だと、パラメータに相当する文字列は"c:\dev1\" "c:\dev2\a.txt"
。
すると、「c:\dev1" c:\dev2\a.txt」という謎の文字列を吐いてくる。
後者だと、パラメータが"c:\dev1\" "c:\dev2\"
で、表示が「c:\dev1" c:\dev2"」になる。
\"
はリテラルなダブルクォートだよ、というのはまだわからんではないが、エスケープされてないダブルクォートを消すわりにc:\dev1"
で一つのパラメータとして解釈しない感じなんなの?
先に分割してから両端のダブルクォートを削除すりゃいいだろうが!
んで、パラメータの末尾が\
でない、つまり、以下のようなコマンドラインであれば、期待通りに各パラメータを表示してくれる。
C:\Apps\test.exe "c:\dev1" "c:\dev2\a.txt"
C:\Apps\test.exe "c:\dev1" "c:\dev2"
いちおう、パラメータが複数の"
とスペースを含み、かつ末尾が"
である場合に、分割してA_Args
に格納し直す……といった処理がAutoHotKey側で書けなくもないが、ちょっとやってらんない。
要するに、ことコンパイル済みのAutoHotKeyスクリプトをポチエスから実行する場合、パラメータとして渡すマクロは**%M
ではなく%-M
でなければならない**ということ。
言うまでもないが、コマンドプロンプト等のコンソール上から実行する場合も、末尾に\
を含むフォルダパスを渡してしまわないよう留意せねばならない。