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文の形式は、文字列のデリミタによる分解の際の定石である。ループの意味は無い。
つづく