WHICHコマンド (3) 〜DOSKEYマクロのサーチ〜

3回目は、DOSKEYマクロのサーチである。関連したスクリプト部分を以下に示す。2回目も参照。

01 【前処理】
02 for %%X in (%*) do (
03  for /f "delims=" %%A in ('DOSKEY /MACROS') do (
04   for /f "delims==" %%B in ("%%A") do if /i "%%B" == "%%X" echo %%A
05  )
06  【ビルトインコマンドのチェック】
07  【カレントディレクトリおよびパス指定時のサーチ】
08  【PATHのサーチ】
09 )
10 【後処理】

03行のfor /f文では、' 'とコマンド指定なのでDOSKEY /MACROSコマンドが実行され、マクロ定義内容が1行ずつ出力される。この出力をfor /f文が捕まえて、制御変数に1行ずつセットする。制御変数へのセットの仕方は、delims=とパラメータで指定されているためデリミタ無しつまり行全体が%%Aにセットされる。

04行のfor /f文では、その%%Aの値をdelims==の指定で制御変数にセットする。文字列指定なのでループはしない。つまり、イコールをデリミタとしてその前(マクロ名に相当)が%%Bにセットされる。tokens=パラメータが指定されていないので、その後ろ(マクロ提示の実体)はどこにもセットされない。

04行のif文ではマクロ名の%%Bオペランド%%X/i指定により大文字小文字を無視して比較し、一致すればそれはDOSKEYマクロ名であるので、その定義行である%%Aを表示する。
マクロ名が見つかったわけなので、03行?05行のループから抜け出すべきだがスクリプトが長くなるため省略した。ループ回数はせいぜい数回だから。

04行のfor /f文の形式は、文字列のデリミタによる分解の際の定石である。ループの意味は無い。

つづく