Comment puis-je «quel <binaire>» dans cmd.exe

10

Existe-t-il un moyen de déterminer rapidement où se trouve un binaire (vers lequel la %PATH%variable pointe).

C'est quelque chose qui ferait l'équivalent d' which perlun shell Unix traditionnel.

Je comprends que le kit de ressources a une wherecommande, mais ce kit n'est pas installé sur mon ordinateur (d'entreprise), donc je ne peux pas l'utiliser where.

René Nyffenegger
la source

Réponses:

14

Un one-liner cmd.exe whichserait:

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

Vous pouvez le coder comme un simple which.bat:

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

EDIT: il nécessite le nom complet du binaire:, which perl.exenon which perl. Il est possible d'écrire un fichier batch qui prend en compte% PATHEXT%, il n'a donc pas besoin du nom complet du binaire. Faites-le moi savoir si vous en avez besoin.

EDIT2: de toute façon j'ai décidé d'écrire le fichier batch. C'est ici:

@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

Tout d'abord, selon la suggestion de Bob, il vérifie si le binaire existe dans le répertoire courant. Si le binaire n'est pas trouvé, une autre boucle est exécutée qui effectue la recherche dans la variable% PATH%.

Les boucles sont basées sur if ... goto, la forcommande est utilisée uniquement pour diviser la extvaleur par ';' personnage. La valeur de %PATHEXT%est ajoutée avec une extension vide, ce qui permet de rechercher un binaire entièrement nommé - les deux which perlet which perl.exefonctionne.

MBu
la source
1
Eh bien, si vous finissez par écrire un fichier de commandes étendu, vous pouvez aussi bien aller jusqu'au bout et vérifier d' .\binary.*abord. Le système d'exploitation recherche toujours d'abord dans le répertoire en cours, avant de rechercher dans les répertoires du chemin de commande.
Bob