はじめに
UNIX では実行コマンドの置き場所を環境変数 PATH
を辿って検索してくれる WHICH
コマンドというものがある。これが Windows でも欲しいという話である。
実装コード
実装コードを以下に示す。
拡張子が指定されている場合は FOR
コマンドの機能を使えば一発である。拡張子が指定されていない場合(たいていの場合はコチラのほうだろうが)環境変数 PATHEXT
に登録された拡張子を一つずつ試していく。環境変数 PATHEXT
は .COM;.EXE;.BAT;.CMD
のようにセミコロンで区切られた文字列であるが,FOR
コマンドではセミコロンを区切り文字と認識してくれるので,そのまま FOR
コマンドに引き渡せばループ変数 %%J
に拡張子が代入されるので,一つずつ試していけばよい。
@echo off
setlocal enabledelayedexpansion
if "%~1"=="" goto USAGE
if "%~x1"=="" (
for %%J in ( %PATHEXT% ) do (
for %%I in ( "%~1%%J" ) do set RESULT=%%~$PATH:I
if defined RESULT echo !RESULT!
)
) else (
for %%I in ( "%~1" ) do set RESULT=%%~$PATH:I
if defined RESULT echo !RESULT!
)
exit /b
:USAGE
echo パスを検索してコマンドのフルパスを返します。
echo.
echo WHICH(.CMD) [コマンド(.拡張子)]
echo.
echo 拡張子の指定を省略すると環境変数 PATHEXT を順に検索します。
exit /b
実行例
引数なしで実行するとヘルプメッセージを表示する。
c:\>which
パスを検索してコマンドのフルパスを返します。
WHICH(.CMD) [コマンド(.拡張子)]
拡張子の指定を省略すると環境変数 PATHEXT を順に検索します。
コマンドが見つかるとフルパス名を出力する。
c:\>which sort
C:\Windows\System32\sort.exe
コマンドが見つからなかったときは何も出力されない。なお,コマンドプロンプト CMD.EXE
の内部コマンドは検索の対象外である。
c:\>which dir
まとめ
実は Windows Vista 以降,WHERE
というコマンドが追加されたので,わざわざ自作する必要はなくなっている。WHERE
コマンドは自作の WHICH
コマンドと同等以上の機能を持つので普通の人は WHERE
コマンドを使ったほうがよいだろう。
c:\>where /?
WHERE [/R ディレクトリ] [/Q] [/F] [/T] パターン...
説明:
検索パターンに一致するファイルの場所を表示します。
既定では、現在のディレクトリおよび PATH 環境変数によって指定された
パス内を検索します。
パラメーター一覧:
/R 指定したパターンに一致するファイルを、指定したディレクトリから
開始して再帰的に検索し表示します。
/Q 一致したファイルの一覧を表示せずに、終了コード
のみを返します (Quiet モード)。
/F 一致したファイル名を二重引用符内に表示します。
/T 一致したすべてのファイルのサイズ、最終変更日および時刻を
表示します。
パターン ファイルの検索パターンを指定します。パターンには
ワイルドカードである * および ? を使用することができます。
"$env:pattern" や "path:pattern" 形式で指定する
こともできます。"env" は環境変数で、"env" 環境
変数で指定されたパスで検索が行われます。これら
の形式は /R スイッチと同時には使用できません。
パターンに PATHEXT 変数の拡張子を追記して
検索を実行することもできます。
/? このヘルプを表示します。
注意: このツールは、検索に成功するとエラー レベル 0 を、
成功しなかった場合は 1 を、失敗またはエラーの場合は
2 を返します。
例:
WHERE /?
WHERE myfilename1 myfile????.*
WHERE $windir:*.*
WHERE /R c:\windows *.exe *.dll *.bat
WHERE /Q ??.???
WHERE "c:\windows;c:\windows\system32:*.dll"
WHERE /F /T *.dll
デフォルトの動作では環境変数 PATH
を検索するので,拙作の WHICH
コマンドと同じである。
c:\>where where
C:\Windows\System32\where.exe
ただし,自作の WHICH
コマンドは WHERE
コマンドよりも小気味よく動いてくれるのが唯一の慰めである。