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、ワーク変数を使うためsetlocalとendlocalで囲む。
04から07で、ローカル変数BLTにビルトインコマンドを空白区切りでセットする。好みで ; や , 区切りでも良い。
HELPコマンドで表示されるコマンドのうち、COMやEXEの実行ファイルが存在しないものをビルトインコマンドとしてある。もしかしたらこれら以外に隠しコマンドがあるかもしれないけど。
08と13がメインループである。複数個のオペランドに対してそれぞれ、DOSKEYマクロサーチ、ビルトインコマンドチェック、カレントディレクトリサーチ、PATHの各ディレクトリサーチを順次実行する。見つからなかった場合のエラー表示は特に行っていない。
10のforループでビルトインコマンドのチェックを行っている。大文字小文字の同一視のために、ifの/iオプションを使って比較し、一致すれば cmd.exe builtin と表示する。
つづく