Jak mogę „które <binarne>” w cmd.exe

10

Czy istnieje sposób szybkiego ustalenia, gdzie znajduje się plik binarny (na który %PATH%wskazuje zmienna).

Jest to coś, co byłoby równoważne z which perltradycyjną powłoką uniksową.

Rozumiem, że Zestaw zasobów ma wherepolecenie, ale ten zestaw nie jest zainstalowany na moim (korporacyjnym) komputerze, więc nie mogę go użyć where.

René Nyffenegger
źródło

Odpowiedzi:

14

Jednowierszowy program cmd.exe whichmógłby być:

for %G in (<binary.exe>) do @echo.%~$PATH:G

Możesz to zakodować w prosty sposób. Bat:

@echo off
for %%G in (%1) do @echo.%%~$PATH:G

EDYCJA: wymaga pełnej nazwy pliku binarnego:, which perl.exenie which perl. Możliwe jest napisanie pliku wsadowego, który uwzględnia% PATHEXT%, więc nie potrzebuje pełnej nazwy pliku binarnego. Daj mi znać, jeśli będziesz tego potrzebować.

EDIT2: w każdym razie postanowiłem napisać plik wsadowy. Oto on:

@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

Po pierwsze, zgodnie z sugestią Boba, sprawdza, czy plik binarny istnieje w bieżącym katalogu. Jeśli plik binarny nie zostanie znaleziony, wykonywana jest kolejna pętla, która przeszukuje zmienną% PATH%.

Pętle są oparte na if ... goto, forpolecenie służy tylko do podzielenia extwartości przez ';' postać. Wartość parametru %PATHEXT%jest poprzedzona pustym rozszerzeniem, które pozwala na wyszukiwanie pełnych nazw plików binarnych - zarówno which perli which perl.exedziała.

MBu
źródło
1
Cóż, jeśli skończysz pisać rozszerzony plik wsadowy, równie dobrze możesz przejść całą sprawę i sprawdzić .\binary.*najpierw. System operacyjny zawsze najpierw szuka w bieżącym katalogu, zanim przeszuka katalogi w ścieżce poleceń.
Bob