Como posso "qual <binário>" no cmd.exe

10

Existe uma maneira de determinar rapidamente onde um binário (para o qual a %PATH%variável aponta) está localizado.

Isso é algo que faria o equivalente which perlem um shell unix tradicional.

Entendo que o Kit de recursos tem um wherecomando, mas esse kit não está instalado no meu computador (corporativo), portanto não posso usá-lo where.

René Nyffenegger
fonte

Respostas:

14

Uma linha única de cmd.exe para whichseria:

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

Você pode codificá-lo como um simples what.bat:

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

EDIT: requer nome completo do binário:, which perl.exenão which perl. É possível gravar um arquivo em lote que leve% PATHEXT% em consideração, para que não seja necessário o nome completo do binário. Entre em contato se precisar.

EDIT2: de qualquer maneira eu decidi escrever o arquivo em lotes. Aqui está:

@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

Primeiro, conforme a sugestão de Bob, ele verifica se o binário existe no diretório atual. Se o binário não for encontrado, outro loop será executado, que fará a busca pela variável% PATH%.

Os loops são baseados if ... goto, o forcomando é usado apenas para dividir o extvalor por ';' personagem. O valor de %PATHEXT%é anexado com uma extensão vazia, que permite procurar por binário totalmente nomeado - ambos which perle which perl.exefunciona.

MBu
fonte
11
Bem, se você acabar gravando um arquivo em lotes estendido, poderá percorrer todo o caminho e verificar .\binary.*primeiro. O sistema operacional sempre pesquisa primeiro no diretório atual, antes de pesquisar os diretórios no caminho do comando.
Bob