Como eu posso “qual binário” no cmd.exe

8

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

Isso é algo que faria o equivalente a which perl em um shell unix tradicional.

Eu entendo que O Resource Kit tem um comando where , mas esse kit é não instalado no meu computador (corporativo), por isso não posso usar where .

    
por René Nyffenegger 16.04.2012 / 11:30

2 respostas

13

Um one-liner cmd.exe para which seria:

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

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

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

EDIT: requer nome completo do binário: which perl.exe , não which perl . É possível gravar um arquivo em lote que leve em consideração% PATHEXT%, portanto, não é necessário o nome completo do binário. Por favor, deixe-me saber se você precisar.

EDIT2: de qualquer maneira eu decidi escrever o arquivo de lote. 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, o que faz a pesquisa através da variável% PATH%.

Os loops são baseados no comando if ... goto , for é usado apenas para dividir o valor ext por ';' personagem. O valor de %PATHEXT% é prefixado com uma extensão vazia, que permite a pesquisa de binário totalmente nomeado - ambos which perl e which perl.exe works.

    
por 16.04.2012 / 11:46
3

Você pode experimentar a coleção de utilitários de Paul Sadowski - ele inclui um which . Veja em: link

    
por 16.04.2012 / 17:05