WHICHコマンド (1) 〜仕様とDOSKEYマクロ〜

実験のネタが尽きてきたので、これから何回かに分けて自作のWHICH.BATというスクリプトの解説でもしようかと思います。
まずは、仕様から。
unixwhichというコマンドがある。シェルがコマンドを実行する際にPATH環境変数をサーチするが、その実際に実行される実行ファイルのフルパス名を表示する。組み込みコマンドや別名定義名、関数定義名であればその旨を表示する。

今回紹介するWHICH.BATでは、それにならった機能を持つが一部機能を違えてある。
(1) PATHEXT環境変数を参照し、拡張子を付加してサーチする(CMD.EXEの機能と合わせるため)
(2) 該当する実行コマンドが複数ある場合はすべて表示する(そのほうが便利と思う)
(3) シェルの別名定義に代わってDOSKEYマクロ定義を参照する(CMD.EXEの機能と合わせるため)
(4) その他、CMD.EXEのコマンド探索方法に合わせる
(5) PATHをサーチして見つけた最初の実行ファイルのフルパスを環境変数 _ 」にセットする
   (unixでは、ls -l `which ruby` のようなことが出来るが、CMDでは出来ない。この機能で、which ruby 実行後 dir %_% と出来る)

最初に探索するのは、DOSKEYマクロである。これはCMD組み込みコマンドに優先する。
例えば、DOSKEY rm=del $* と実行しておくと、del コマンドと同じように rm コマンドを使える。

以下、DOSKEYマクロについて少々解説。まあ、これはきっとどこかのウェブページにも書いてあると思うのでここでわざわざ書かなくてもいいかもしれないが。

マクロは行頭だけで有効。空白があってもだめである。iffor do& 等の後ろに書きたいときは、行末に ^ を書いて改行し、次の行の行頭から書く。

あと、BATスクリプトの中でも使えない。BATスクリプトの中でDOSKEYで定義してもだめ。unixでもシェルスクリプトの中でalias名を使うことはあまり無い(alias名が効かないように書くのが普通かな)のでまあいいか。

コマンドプロンプトを開く際に、最初にいくつかのマクロ定義を行うと便利である。これには、DOSKEY /MACROFILE=C:\xxx\yyy を実行すればいい。C:\xxx\yyy (私は C:\usr\doskey.ini に置いてます) には、

CD=CD /D $*
ED=C:\usr\tpad\TeraPad.exe $*
VI=C:\usr\vim3j21b\VIM32.EXE $*

等と、1行に1つずつマクロ定義(マクロ名=コマンド)を書いておく。詳しくは DOSKEY /? を参照。

コマンドプロンプトを開く際に自動的にこのコマンドを実行するには2通りの方法がある。
1つめはレジストリを設定する方法で、6/14記事もしくは CMD /? を参照。
2つめは、レジストリをいじりたくない人向き。コマンドプロンプトのショートカットで、リンク先が CMD.EXE となっているところを、
 CMD.EXE /K DOSKEY /MACROFILE=C:\xxx\yyy
 とする。ただし、この方法だと、コマンドプロンプト起動時の、

Microsoft Windows XP [Version 5.1.2600]
 (C) Copyright 1985-2001 Microsoft Corp

 というようなメッセージが出ない(まあ、出なくてどうということはないですが)。

つづく