環境変数PATHからのコマンドの探索(which,where)
唐突にバッチプログラムとして書いてみた。
一応、ご存じない方のために説明すると、UNIX/Linuxでは、以下のコマンドが提供されていたりする(環境依存)。
- which
- 環境変数PATHから指定したコマンドを探し出し、そのフルパスを出力する。
- 一つ見つかった時点で終了する。
- where
- 環境変数PATHから指定したコマンドを探し出し、そのフルパスを出力する。
- PATHにセットされているすべてのディレクトリに対して試行する。
なお、確認環境はWindows Vista Business(32bit版)のみなので、他で動かなかったら‥ゴメンナサイ
which.bat
こっちは一つだけ出せばいいので比較的簡単。
@ECHO OFF
SETLOCAL
FOR %%I IN (%1.bat %1.exe %1) DO (
IF NOT "%%~$PATH:I"=="" (
SET f=%%~$PATH:I
)
)
IF NOT "%f%"=="" (
echo %f%
)
ENDLOCALこんな感じで使用する。
C:\> which.bat hoge C:\> which.bat notepad C:\Windows\System32\notepad.exe C:\>
where.bat
こっちはちょっと面倒。環境変数PATHのデリミタであるセミコロンで区切って順次試行‥なのだが、トークンの数が任意なので、「FOR /F」を単純に使用することはできない。
で、どうしたかというと、「先頭のディレクトリと残りに分割し、先頭のディレクトリに対して試行する」というルーチンを作り、それを「残り」がなくなるまで続けるという形で実装。
@ECHO OFF
SETLOCAL
SET p=%PATH%
:_BEGIN
CALL :_WHERE %1
IF NOT "%p%"=="" GOTO _BEGIN
GOTO _END
:_WHERE
FOR /F "tokens=1,* delims=;" %%i IN ("%p%") DO (
IF EXIST %%i\%1 (
ECHO %%i\%1
) ELSE IF EXIST %%i\%1.exe (
ECHO %%i\%1.exe
) ELSE IF EXIST %%i\%1.bat (
ECHO %%i\%1.bat
)
SET p=%%j
)
EXiT /B
:_END
ENDLOCALこんな感じで使用する。
C:\> where.bat hoge C:\> where notepad C:\Windows\system32\notepad.exe C:\Windows\notepad.exe C:\>
をぉ、notepad.exeって2箇所にあるんだ‥
オチ
C:\> where.bat where C:\Windows\system32\where.exe C:\>
‥‥え!?
C:\> C:\Windows\system32\where.exe notepad C:\Windows\System32\notepad.exe C:\Windows\notepad.exe C:\>
‥‥もしかしてwhereは作らなくても元からあった!?‥orz