2798 votes

Existe-t-il un équivalent de "which" dans la ligne de commande Windows ?

Comme j'ai parfois des problèmes de chemin, où l'un de mes propres scripts cmd est caché (shadowé) par un autre programme (plus tôt sur le chemin), j'aimerais être capable de trouver le chemin complet d'un programme sur la ligne de commande Windows, étant donné seulement son nom.

Existe-t-il un équivalent de la commande UNIX "which" ?

Sous UNIX, which command imprime le chemin complet de la commande donnée pour trouver et réparer facilement ces problèmes d'ombrage.

0 votes

Que fait "which" sous Unix ?

3 votes

Foredecker : "which" recherche dans le PATH l'exécutable qui sera lancé si vous tapez une commande à l'invite du shell.

3 votes

Par exemple, si vous avez 5 versions de Java installées et que vous ne savez pas laquelle est utilisée, vous pouvez taper "which java" et cela vous donnera le PATH du binaire.

2969voto

Michael Ratanapintha Points 11957

Windows Server 2003 et les versions ultérieures (c'est-à-dire tout ce qui est postérieur à Windows XP 32 bits) fournissent les fonctionnalités suivantes where.exe qui fait une partie de ce que which le fait, bien qu'il corresponde à tous les types de fichiers, et pas seulement aux commandes exécutables. (Elle ne correspond pas aux commandes intégrées de l'interpréteur de commandes comme cd .) Il accepte même les caractères de remplacement, ainsi where nt* trouve tous les fichiers dans votre %PATH% et le répertoire courant dont le nom commence par nt .

Essayez where /? pour de l'aide.

Notez que Windows PowerShell définit where comme un alias pour le site Where-Object cmdlet donc si vous voulez where.exe vous devez taper le nom complet au lieu d'omettre l'élément d'identification. .exe extension. Vous pouvez également lui attribuer un alias :

Set-Alias which where.exe

Mise à jour : Utilisation de Get-Command (alias : gcm ) est recommandé car il est natif de PS et récupère tous les types de commandes : alias, cmdlets, exécutables et fonctions. Exemple :

gcm notepad*

32 votes

Non, parce que grep examine le contenu de son entrée, que vous devez donner explicitement. dont y où.exe ne regardez que le noms des fichiers d'un ensemble de répertoires définis dans les variables d'environnement PATH.

12 votes

@Ajedi32 - Correct, dont n'est pas dans XP. Comme je l'ai dit, "Windows Server 2003 et ultérieur".

3 votes

@MichaelRatanapintha Ouais, pour une raison quelconque, je pensais que Windows Server 2003 avait été créé avant Windows XP. Mec, XP est vieux...

316voto

paxdiablo Points 341644

Alors que les versions ultérieures de Windows ont un where vous pouvez également le faire avec Windows XP en utilisant les modificateurs de variables d'environnement, comme suit :

c:\> for %i in (cmd.exe) do @echo.   %~$PATH:i
   C:\WINDOWS\system32\cmd.exe

c:\> for %i in (python.exe) do @echo.   %~$PATH:i
   C:\Python25\python.exe

Vous n'avez pas besoin d'outils supplémentaires et il n'est pas limité à PATH puisque vous pouvez substituer n'importe quelle variable d'environnement (au format chemin d'accès, bien sûr) que vous souhaitez utiliser.


Et, si vous en voulez un qui peut gérer toutes les extensions dans PATHEXT (comme le fait Windows lui-même), celui-ci fait l'affaire :

@echo off
setlocal enableextensions enabledelayedexpansion

:: Needs an argument.

if "x%1"=="x" (
    echo Usage: which ^<progName^>
    goto :end
)

:: First try the unadorned filenmame.

set fullspec=
call :find_it %1

:: Then try all adorned filenames in order.

set mypathext=!pathext!
:loop1
    :: Stop if found or out of extensions.

    if "x!mypathext!"=="x" goto :loop1end

    :: Get the next extension and try it.

    for /f "delims=;" %%j in ("!mypathext!") do set myext=%%j
    call :find_it %1!myext!

:: Remove the extension (not overly efficient but it works).

:loop2
    if not "x!myext!"=="x" (
        set myext=!myext:~1!
        set mypathext=!mypathext:~1!
        goto :loop2
    )
    if not "x!mypathext!"=="x" set mypathext=!mypathext:~1!

    goto :loop1
:loop1end

:end
endlocal
goto :eof

:: Function to find and print a file in the path.

:find_it
    for %%i in (%1) do set fullspec=%%~$PATH:i
    if not "x!fullspec!"=="x" @echo.   !fullspec!
    goto :eof

Il renvoie en fait toutes les possibilités, mais vous pouvez le modifier assez facilement pour des règles de recherche spécifiques.

8 votes

Hé, j'aurais aimé apprendre ça ! Dommage que ça ne fonctionne pas avec MS-DOS ou Win9x (c'est-à-dire avec command.com). (Raymond Chen a une version plus "élaborée" que vous pouvez transformer en fichier batch : blogs.msdn.com/oldnewthing/archive/2005/01/20/357225.aspx )

134 votes

@Michael, si vous utilisez toujours DOS ou Win95, trouver les exécutables sur le chemin sont les moins de vos problèmes :-)

0 votes

Windows reconnaît plus que le .exe comme exécutable. La dernière fois que j'ai codé un which à l'époque de W95/DOS, il est vrai, l'ordre de recherche était le suivant : répertoire courant, puis chaque répertoire de chemin, pour cmd.com, puis cmd.exe, puis cmd.bat. Donc, même cmd.bat dans le répertoire courant est exécuté avant cmd.exe quelque part dans le chemin.

70voto

Casey Points 19286

Dans Windows PowerShell :

set-alias which where.exe

45voto

RexE Points 4498

Si vous avez installé PowerShell (ce que je recommande), vous pouvez utiliser la commande suivante comme équivalent approximatif (remplacez programName par le nom de votre exécutable) :

($Env:Path).Split(";") | Get-ChildItem -filter programName*

La suite est ici : Mon Manwich ! PowerShell qui

1 votes

Je cherchais exactement cette commande powershell lapidaire. J'avais utilisé where.exe, mais le fait de devoir manipuler le code d'erreur en plus de l'analyse de son résultat est bien inférieur à une solution powershell native. Merci !

10 votes

Mais ($Env:Path).Split(";") | Get-ChildItem -filter programName* est si facile à taper... ;-)

0 votes

Cela échoue également si vous avez une variable dans votre chemin qui est normalement résolue par le système (alias %JAVA_HOME%).

39voto

Ferruccio Points 51508

El GnuWin32 les outils ont which ainsi qu'un grand nombre d'autres outils Unix.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X