web-dev-qa-db-ja.com

cmd.exeで「どの<binary>」を使用するにはどうすればよいですか

バイナリ(%PATH%変数が指す)がどこにあるかをすばやく判断する方法はありますか。

これは、従来のUNIXシェルでwhich Perlと同等のことを行うものです。

リソースキットwhereコマンドがあることを理解していますが、このキットは私の(企業)コンピューターにインストールされていないため、whereを使用できません。

10

whichのc​​md.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 Perlwhich Perl.exeの両方が機能します。

14
MBu

PaulSadowskiのユーティリティコレクションを試すことができます。彼にはwhichが含まれています。でそれを見てください: http://www.paulsadowski.com/wsh/cmdprogs.htm

3
yosh m