Windows用のwhichコマンドを作ってみた

Windows用のwhichコマンドをバッチファイルで作ってみました。Windows 2000以降であれば、たぶん動作すると思います。なお、@ITにも同じような記事(whichコマンドを作る)がありますが*1、こちらの方が以下の2つの点で優れています。(そのかわり、簡潔さは全くありませんが...)

使い方は簡単です。以下の内容のバッチファイルを、「which.cmd」もしくは「which.bat」という名前で保存し、パスの通ったディレクトリにコピーしてください。「which コマンド名」で、コマンドのパスが表示されます。

@echo off

if "%~1" == "" exit /b 1

if /I "%~1" == "%~nx1" (
    call :search ".\%~1"
    if not ERRORLEVEL 1 exit /b 0
)

call :search "%~1"
exit /b %ERRORLEVEL%

:search
if "%~x1" == "" (
    call :search_without_ext "%~1"
) else (
    call :search_with_ext "%~1"
)
exit /b %ERRORLEVEL%

:search_without_ext
for %%I in (%PATHEXT:;=,%) do (
    call :search_with_ext "%~1%%I"
    if not ERRORLEVEL 1 exit /b 0
)
exit /b 1

:search_with_ext
if "%~$PATH:1" == "" exit /b 1
echo %~$PATH:1
exit /b 0


覚え書き

  • ディレクトリ指定の無いコマンドの場合、まずカレントディレクトリが検索され、次に環境変数PATHが使われる。
  • コマンドの拡張子が指定されなかった場合、環境変数PATHEXTの拡張子を使って検索される。
  • 「%1」に対して「%~$PATH:1」という表現を使うところがポイント。

*1:実をいうと、作り終えてから気づきました。

*2:私はPATHEXTに「.LNK」を追加しているのですが、そのような環境でも正しく動作します。