WHICHコマンド (5) 〜コマンド探索(後編)〜
5回目は、PATH環境変数のサーチ。基本的には前回と同じチェックを、PATHの内容を順次付加しながら行っていく。今回は最初にスクリプトを示す。
全体については2回目を参照。そこで書いた【パスのサーチ】というのが以下である。入力された文字列は、%%Xに入っている。
01 if "%%~X" == "%%~nxX" ( 02 for %%P in ("%PATH:;=";"%") do ( 03 if not "%%~xX" == "" if exist %%P\%%X ( 04 for /f "delims=" %%W in ("%%~P\%%~X") do if not exist %%~sW\NUL ( 05 echo %%~P\%%~X 06 【後処理】 07 ) 08 ) 09 for %%S in (%PATHEXT%) do if exist %%~sP\%%X%%S ( 10 for /f "delims=" %%W in ("%%~P\%%~X%%S") do if not exist %%~sW\NUL ( 11 echo %%~P\%%~X%%S 12 【後処理】 13 ) 14 ) 15 ) 16 )
01行ではまず、入力された文字列%%Xにパス部分(\)が含まれているかどうかを判断している。含まれていればPATH環境変数のサーチは行われないので以下の処理をスキップする。for制御変数に対して直接\の有無をチェックできないので、ファイル名部分(~n)と、拡張子部分(~x)を取り出して、それが元の文字列全体と等しければ、元の文字列にパス部分が無かったことがわかる。空白が含まれている可能性があるので、" "で囲んで比較する。
02行では、PATH環境変数をここの要素を" "を囲みながら、for /f文で展開する。この部分の詳細は、7/22:%PATH%の要素分解を参照。
03-04行でのチェックは、前回と同じ。
「もし、拡張子があり、かつ、%%Pのディレクトリに%%Xが存在して、かつ、それがディレクトリでなければ、パス名を表示する」
ディレクトリかどうかの判断はちょっとやっかい。7/28:ディレクトリかどうかの判断では、ショート形式のフルパスが必要である。フルパスを構成するのは、%%P、%%Xの2つのfor制御変数だが、これは、それぞれショート形式修飾子をつけて連結した%%~sP%%~sXは知りたいものとは一致しない(自分で実験ください)。
求めるショート形式を得るためには、一旦ひとつのfor制御変数にセットする必要がある。
これが04行である。%%P、%%Xから" "を除去(構文エラーを避けるため)して連結し、全体を%%Wにセットする。
後は前回の通り、if not exist %%~sW\NULでディレクトリでないことを確認できればOKである。
09行目からは、PATHEXTの内容を順次付加して前回と同じようにチェックする。今回のフルパス名を構成するのは、%%P、%%X、%%Sの3つである。これらを" "を除去して連結し、全体を%%Wにセットする。
チェックがOKであれば、実行されるファイル名を、" "を除去して表示する。
次回は、サーチ結果の環境変数 _ へのセット部分である。
つづく