S-JIS[2006-07-06/2016-12-10] 変更履歴

MS-DOSのwhichもどき

WindowsXPのコマンドプロンプトで動く、UNIXのwhichコマンドもどきのバッチファイル。
(コマンドプロンプトではwhereコマンドがUNIXのwhich相当[2016-12-10]

以下の内容を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=					←見つからないとき

which.bat

@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ならデフォルトで有効だが、念のため。


DOSメモへ戻る / 自作ソフトへ戻る / 技術メモへ戻る
メールの送信先:ひしだま