WindowsXPのコマンドプロンプトで動く、UNIXのwhichコマンドもどきのバッチファイル。
以下の内容をwhich.batというファイル名で保存し、パスの通っているディレクトリに置いておくと
「which コマンド名」で、そのコマンドのファイルがどこに存在しているか表示される。
実行例:
C:\>which javac.exe javac.exe=c:\j2sdk1.4.0_01\bin\javac.exe C:\>which javac ←拡張子が無くてもOK javac=c:\j2sdk1.4.0_01\bin\javac.exe C:\>which ls ls=dir /b ←エイリアスもOK C:\>which hoge hoge= ←見つからないとき
@echo off
rem 引数が無いとき
if "%~1"=="" (
echo search command-path from PATH
echo by hishidama 2006-07-06
echo usage: %0 command
exit/b
)
setlocal
rem ファイルそのものが存在しているとき
if exist %~1 (
set f=%~f1
goto end
)
rem エイリアスの探索
for /f "delims== tokens=1,*" %%i in ('doskey /macros') do (
if "%%i"=="%~1" set f=%%j & goto end
)
rem 拡張子があるとき
if not "%~x1"=="" (
set f=%~f$PATH:1
goto end
)
rem 拡張子を付与してカレントディレクトリの探索
for %%e in (%PATHEXT%) do (
if exist %~1%%e call :full_path %~1%%e & goto end
)
rem 拡張子を付与して環境変数PATHの探索
for %%e in (%PATHEXT%) do (
call :search_path %~1%%e
if errorlevel 1 goto end
)
set f=
goto end
:full_path
set f=%~f1
exit/b
:search_path
set f=%~$PATH:1
if "%f%"=="" exit/b 0
exit/b 1
:end
echo %1=%f%
endlocal
中核は、
set f=%~f$PATH:1
バッチの実行時引数%1に対し、環境変数PATHで指定された各ディレクトリの中から一致するファイルを探す。そしてそれをフルパスに変換している。
詳細は「help call」または「call /?」参照。
この機能を使うには、コマンドプロンプトの起動時に拡張機能が有効になっていないといけない。WindowsXPならデフォルトで有効だが、念のため。