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であれば、実行されるファイル名を、" "を除去して表示する。

次回は、サーチ結果の環境変数 _ へのセット部分である。

つづく