./myarghelper.exe.txt
myarghelper.exe は ArgHelper.exe の機能を拡張するものです。
ArgHelper.exe は、Gentaro Muramatsu さんが作成したプログラムで、myarghelper.exe はその機能を参考にして作成したものです。
◇ ArgHelper.exe の概要
ArgHelper.exe は、Gentaro Muramatsu さんが作成したもので、C++ を使って作成されていて、ソースも公開されています。
ArgHelper.exe
// Copyright (C) 2000, Gentaro Muramatsu
ArgHelper.exe は、それを hoge.exe のような任意の基幹部分の名前 (この例では hoge) を持ち、拡張子が .exe のファイル名を持つファイルに複写して使用します。
つまり、
$ copy ArgHelper.exe hoge.exe
のようにして、hoge.exe を作成します。
以下、hoge.exe をこのようにして作成したものとして、使い方を説明します。
hoge.exe (元は、ArgHelper.exe) が実行されると、自分の名前のhoge を基幹部分とし、拡張子が .ini のファイル、つまりhoge.ini を「設定ファイル」として読み込みます。hoge.ini は、hoge.exe と同じディレクトリに置かないといけません。
設定ファイルはつぎのような約束に従って、ユーザ(ArgHelper.exe をhoge.exe という名前でコピーした人) が作成します。
(形式)
1行目: 実行ファイル名 (絶対パス指定しか試していません)
(例えば C:¥Windows¥notepad.exe)
2行目: コマンドラインオプション
(例えば /P)
実行ファイル hoge.exe を実行すると,設定ファイル hoge.ini の1行目で指定したファイルが実行されます.このとき,設定ファイル hoge.ini の2行目に書いたオプションと実行時に与えられたオプションを空白1つで接続したものが引数として与えられます。hoge.ini の内容が
C:¥Windows¥notepad.exe
/P
であるとして、
$ hoge.exe foobar.txt
とすると、
$ C:¥Windows¥notepad.exe /P foobar.txt
としたように動作します。
◇ myarghelper.exe で変更した機能/追加した機能
myarghelper.exe は、C# を使って作成しました。
(1) |
設定ファイルの拡張子を .ahp にしました。 |
ArgHelper.exe の場合は拡張子が、.ini でしたが、.ini という拡張子は良く使われるので、.ahp を採用しました。ArgHelPer のAHP です。
foo.exe と foo.ahp があれば、foo.exe が
$ copy myarghelper.exe foo.exe
として作られたということがすぐ分かるという利点があります。
(2) |
バージョン番号を表示するオプションを設けました。 |
$ myarghelper.exe /myarghelperversion
とすると、myarghelper.exe のバージョン番号が表示されます。
当然ながら、myarghelper.exe を copy して作成された実行ファイル、例えば、
$ copy myarghelper.exe hoge.exe
として作成された hoge.exe に対して
$ hoge.exe /myarghelperversion
とすると myarghelper.exe のバージョン番号が表示されます。
myarghelper.exe は Windows プログラムです。コンソールプログラムではありません。
コンソールプログラムでは、myarghelper.exe の機能は、バッチファイルでおおむね実現できます。
(4) |
設定ファイル(拡張子 .ahp を持つファイル)の仕様の変更。 |
myarghelper.exe は、ArgHelper.exe と同じ機能を持ちますが、少し機能を拡張しました。
ArgHelper.exe と同様に、myarghelper.exe を hoge.exe のように、任意の「基幹部分」の名前を持つファイルに複写して使用します。
$ copy myarghelper.exe hoge.exe
こうして複写した hoge.exe があるディレクトリに「設定ファイル」を置きます。ただし、設定ファイルはただひとつではなくて、(あれば)複数の設定ファイルから実行時に選択するようにしました。
設定ファイルの選択のルールはつぎのようです。
- まず、最初に、実行ファイルがあるディレクトリと同じディレクトリに、
基幹部分の名前 + "For" + %COMPUTERNAME% + ".ahp"
という名前のファイルがないかを探します。
myarghelper.exe を hoge.exe という名前で複写した場合で、 COMPUTERNAME が KUMANO の場合、
"hoge" + "For" + "KUMANO" + ".ahp" -> hogeForKUMANO.ahp
です。
この形のファイルがあれば、それが「設定ファイル」として採用されます。
hogeForYODO.ahp があっても、%COMPUTERNAME% が KUMANO であるマシンでは、hogeForYODO.ahp は「設定ファイル」とは考えられません。
- 前項で述べたように %COMPUTERNAME% が含まれる形の名前の「設定ファイル」がない場合は、
基幹部分の名前 + ".ahp"
というファイルがないかを探します。
myarghelper.exe を hoge.exe という名前で複写した場合は、
hoge.ahp
です。そういう名前のファイルがあれば、それを「設定ファイル」として採用します。
- 基幹部分の名前 + ".ahp" の形の名前のファイルもない場合は、「設定ファイル」がないということになります。
「設定ファイル」がないと、エラーメッセージを表示する窓がポップアップします。その窓の OK ボタンを押せば、なにもせずにプログラムは終了します。
- hoge.exe (myarghelper.exe をコピーしたファイル) は、上述したルールにしたがって、設定ファイルを選択し、それを読み込みます。
設定ファイルの一行目に書いてあるコマンドに、設定ファイルの二行目に書いてある引数と、hoge.exe を実行するときに渡された引数を加えて実行します。
例えば、hoge.exe の設定ファイルの一行目に
C:¥home¥shiiba¥bin¥foo.exe
と書いてあって、hoge.exe の設定ファイルの二行目に
C:¥script¥bar.uws
と書いてあり、hoge.exe の実行時に、Hello, world. という引数を与えると、
C:¥home¥shiiba¥bin¥foo.exe C:¥script¥bar.uws Hello, world.
が実行されます。
- 設定ファイルの一行目に、絶対パスではなくて、相対パスを使って実行するコマンドを書くことができます。
例えば、hoge.exe の設定ファイルの一行目に
C:¥home¥shiiba¥bin¥foo.exe
のように書いてあるのではなくて、
.¥foo.exe
のように相対パスで書いてあった場合は、hoge.exe (myarghelper.exe をコピーしたファイル)は、.¥foo.exe の . を hoge.exe が置かれているディレクトリと解釈します。
従って、hoge.exe が c:¥home¥tak¥bin にあれば、
c:¥home¥tak¥bin¥foo.exe
が実行されます。
- 設定ファイルの書き方につぎのような特別なルールを導入しました。
設定ファイルの2行目に $(Arguments) という文字列があると、実行時に与えられた引数の全体が、$(Arguments) に置き換えられます。
$(Arguments) を使っている場合には、$(Argument1)、 $(Argument2)、$(Argument3) を使うことはできません。
$(Argument1) という文字列があると、実行時に与えられた引数の1番目の引数に置き換えられます。
$(Argument2) という文字列があると、実行時に与えられた引数の2番目の引数に置き換えられます。$(Argument1) を使っていないのに$(Argument2) を使うことはできません。
$(Argument3) という文字列があると、実行時に与えられた引数の3番目の引数に置き換えられます。$(Argument2) を使っていないのに$(Argument3) を使うことはできません。
$(Argument4) は使うことができません。
- 一行目に start.exe と書いてあった場合は、引数部分を arguments に格納したとして、
System.Diagnostics.Process.Start(arguments);
のようにして、引数部分 arguments を関連付けによって開きます。
- 実行時の引数の第一引数に限り、.¥ で始まると、作業ディレクトリに置き換えられます。第一引数が "..." のように引用符号で囲まれていると、引用符号の内側の最初が .¥ で始まると、作業ディレクトリに置き換えられます。
例えば、myarghelper.exe を runuws.exe という名前に複写して、
PS> cd c:¥foo¥bar
PS> runuws .¥foo.uws a b c
のようにした場合、これは、
PS> runuws c:¥foo¥bar¥foo.uws a b c
のように実行したように動作します。
(重要) 「実行時の引数の第一引数」と設定ファイルの中に書く引数とは異なることに注意してください。
- [2015-04-22] 第一引数に //help を指定すると、コメントファイルを start コマンドを使って表示します。
例えば、myarghelper.exe を hoge.exe という名前で複写した場合は、
PS> hoge //help
とすると、コメントファイル
hoge.exe.txt
が、hoge.exe があるディレクトリにあれば、それを、start コマンドを使って表示します。
第一引数に //help が指定されたときに、標準出力にコメントファイルを書き出したい気もします。しかしmyarghelper.exe は Windows プログラムであって、コンソールプログラムではないので、コンソールに出力することができません。