WHICHコマンド (2) 〜メインループとビルトインコマンド〜

昨日の1回目DOSKEYの説明で疲れたので今日の、2回目は軽く、全体のメインループと、比較的簡単なビルトインコマンドサーチ部分を書く。【 】の部分は3回目以降の説明である。便宜上、行番号をつける。

01 @echo off
02 set _=
03 setlocal
04 set BLT=ASSOC BREAK CALL CD CHDIR CLS COLOR COPY DATE DEL DIR ECHO
05 set BLT=%BLT% ENDLOCAL ERASE EXIT FOR FTYPE GOTO IF MD MKDIR MOVE
06 set BLT=%BLT% PATH PAUSE POPD PROMPT PUSHD RD REM REN RENAME RMDIR
07 set BLT=%BLT% SET SETLOCAL SHIFT START TIME TITLE TYPE VER VERIFY VOL
08 for %%X in (%*) do (
09  【DOSKEYマクロのサーチ】 
10  for %%A in (%BLT%) do if /i "%%X" == "%%A" echo %%X cmd.exe builtin
11  【カレントディレクトリおよびパス指定時のサーチ】
12  【PATHのサーチ】
13 )
14 endlocal
15 【環境変数 _ の後処理】

01は定石。02は、環境変数 _ への結果セットに備えあらかじめ未定義状態にしておく( = の後は空白をあけず改行)。03および14、ワーク変数を使うためsetlocalendlocalで囲む。
04から07で、ローカル変数BLTにビルトインコマンドを空白区切りでセットする。好みで ;, 区切りでも良い。
HELPコマンドで表示されるコマンドのうち、COMやEXEの実行ファイルが存在しないものをビルトインコマンドとしてある。もしかしたらこれら以外に隠しコマンドがあるかもしれないけど。

08と13がメインループである。複数個のオペランドに対してそれぞれ、DOSKEYマクロサーチ、ビルトインコマンドチェック、カレントディレクトリサーチ、PATHの各ディレクトリサーチを順次実行する。見つからなかった場合のエラー表示は特に行っていない。
10のforループでビルトインコマンドのチェックを行っている。大文字小文字の同一視のために、if/iオプションを使って比較し、一致すれば cmd.exe builtin と表示する。

つづく