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.

ポチエス(EsExt)からコンパイル済みAutoHotKeyスクリプトを実行する場合のパラメータに関する問題

Last updated at Posted at 2018-06-26

使用するアプリ

コマンドラインパラメータとして、フォルダを含む複数のパスを渡したい場合。

ポチエスが生成するコマンドライン

esExt5.iniでのコマンドラインの指定は、例えば以下のようになる。
test.exeは、Ahk2Exe.exeでコンパイル済みのAutoHotKeyスクリプトだとする。

esExt5.ini
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の中身を、以下のようなループでパラメータを表示するスクリプトにしてみる。

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でなければならない**ということ。

言うまでもないが、コマンドプロンプト等のコンソール上から実行する場合も、末尾に\を含むフォルダパスを渡してしまわないよう留意せねばならない。

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?