バイナリ(%PATH%
変数が指す)がどこにあるかをすばやく判断する方法はありますか。
これは、従来のUNIXシェルでwhich Perl
と同等のことを行うものです。
リソースキット にwhere
コマンドがあることを理解していますが、このキットは私の(企業)コンピューターにインストールされていないため、where
を使用できません。
which
のcmd.exeワンライナーは次のようになります。
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%を考慮したバッチファイルを作成できるため、バイナリのフルネームは必要ありません。必要な場合はお知らせください。
EDIT2:とにかく私はバッチファイルを書くことにしました。ここにあります:
@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
の両方が機能します。
PaulSadowskiのユーティリティコレクションを試すことができます。彼にはwhich
が含まれています。でそれを見てください: http://www.paulsadowski.com/wsh/cmdprogs.htm