バイナリ(変数が%PATH%
指す)がどこにあるかを素早く判断する方法はありますか。
which perl
これは、従来の Unix シェルで同等の機能を果たすものです。
という事は承知していますリソースキットコマンドがありますwhere
が、このキットは私の(会社の)コンピュータにインストールされていないため、使用できませんwhere
。
答え1
cmd.exe のワンライナーは次のようにwhich
なります。
for %G in (<binary.exe>) do @echo.%~$PATH:G
単純な which.bat としてコード化できます:
@echo off
for %%G in (%1) do @echo.%%~$PATH:G
編集: バイナリの完全な名前が必要です: which perl.exe
、 ではありませんwhich perl
。%PATHEXT% を考慮したバッチ ファイルを作成することは可能ですので、バイナリの完全な名前は必要ありません。必要な場合はお知らせください。
編集2: とにかく、バッチファイルを書くことにしました。これがそれです:
@echo off
setlocal enabledelayedexpansion
set ext= ;%PATHEXT%
:extloop1
for /f "delims=; tokens=1,*" %%A in ("!ext!") do (
if exist %1%%A (
echo .\%1%%A
goto finish
)
set ext=%%B
)
if "!ext!" neq "" goto extloop1
set ext= ;%PATHEXT%
:extloop2
for /f "delims=; tokens=1,*" %%A in ("!ext!") do (
for %%C in (%1%%A) do (
if exist %%~$PATH:C (
echo %%~$PATH:C
goto finish
)
)
set ext=%%B
)
if "!ext!" neq "" goto extloop2
:finish
endlocal
まず、Bob の提案に従って、現在のディレクトリにバイナリが存在するかどうかを確認します。バイナリが見つからない場合は、%PATH% 変数を検索する別のループが実行されます。
ループは に基づいておりif ... goto
、for
コマンドは値を ';' 文字で分割するためにのみ使用されますext
。 の値の%PATHEXT%
先頭には空の拡張子が付加され、完全な名前のバイナリを検索できるようになります。which perl
と の両方which perl.exe
が機能します。
答え2
Paul Sadowski のユーティリティ コレクションを試してみるのもよいでしょうwhich
。これには が含まれています。次の場所で参照してください。http://www.paulsadowski.com/wsh/cmdprogs.htm