2320 votes

Est-il un équivalent de " qui " sur la ligne de commande de Windows?

Comme j'ai parfois des problèmes de chemins, où l'un de mes propres cmd scripts cachés (l'ombre) par un autre programme (plus tôt sur le chemin), je voudrais être en mesure de trouver le chemin d'accès complet à un programme sur la ligne de commande de Windows, avec juste son nom.

Est-il un équivalent de la commande UNIX "qui"?

Sur UNIX, which command imprime le chemin complet de la commande, afin de trouver facilement et de réparation de l'ombrage de ces problèmes.

2525voto

Michael Ratanapintha Points 11957

Windows Server 2003 et, plus tard, de fournir l' where.exe programme qui fait partie de ce qu' which , si elle correspond à tous les types de fichiers, pas seulement les commandes exécutables. (Il ne correspond pas intégré dans le shell de commandes comme cd.) Il va même jusqu'à accepter des caractères génériques, where nt* trouve tous les fichiers dans votre %PATH% et répertoire courant dont le nom commence par nt.

Essayez where /? de l'aide.

Notez que Windows PowerShell définit where comme un alias pour l' Where-Object applet de commande, donc si vous souhaitez where.exe, vous devez taper le nom complet de la place de l'omission de l' .exe extension.

285voto

paxdiablo Points 341644

Tandis que les versions ultérieures de Windows ont un where de commande, vous pouvez également le faire avec Windows XP en utilisant la variable d'environnement modificateurs, 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é à l' PATH puisque vous pouvez remplacer toutes les variables d'environnement (dans le format de 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 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 retourne en fait toutes les possibilités, mais vous pouvez modifier très facilement pour la recherche spécifique de règles.

59voto

Casey Points 19286

Dans windows powershell:

set-alias which where.exe

38voto

RexE Points 4498

Si vous avez PowerShell installé (que je recommande), vous pouvez utiliser la commande suivante comme un équivalent (substitue programName pour votre exécutable du nom):

($Env:Chemin D'Accès).Split(";") | Get-ChildItem -filtre programName*

Plus ici: http://www.codeassassin.com/blog/PermaLink,guid,fd1967d1-f844-4e29-82e2-f2d6424b4ef9.aspx

37voto

Ferruccio Points 51508

Le GnuWin32 outils ont which, ainsi que toute une flopée 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