Question Y a-t-il un équivalent de 'which' sur la ligne de commande de Windows?


Comme j'ai parfois des problèmes de chemin, lorsqu'un de mes propres scripts cmd est caché (occulté) par un autre programme (plus tôt sur le chemin), je voudrais pouvoir trouver le chemin complet d'un programme sur la ligne de commande de Windows, étant donné juste son nom.

Existe-t-il un équivalent à la commande UNIX 'which'?

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


1896
2017-11-20 04:19


origine


Réponses:


Windows Server 2003 et versions ultérieures (c'est-à-dire quelque chose après Windows XP 32 bits) fournissent where.exe programme qui fait une partie de ce which fait, bien qu'il corresponde à tous les types de fichiers, et pas seulement aux commandes exécutables. (Il ne correspond pas aux commandes shell intégrées comme cd.) Il acceptera même les caractères génériques, donc where nt* trouve tous les fichiers dans votre %PATH% et répertoire courant dont les noms commencent par nt.

Essayer where /? pour aider.

Notez que Windows PowerShell définit where comme un alias pour la Where-Object cmdlet, donc si tu veux where.exe, vous devez taper le nom complet au lieu d'omettre le .exe extension.


2103
2017-11-20 05:52



Alors que les versions ultérieures de Windows ont un where commande, vous pouvez également le faire avec Windows XP en utilisant les modificateurs de variable 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 ce n'est pas limité à PATH puisque vous pouvez remplacer n'importe quelle variable d'environnement (dans le format de chemin, 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 le fait), 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 toutes les possibilités, mais vous pouvez le modifier assez facilement pour des règles de recherche spécifiques.


256
2017-11-20 05:48



Sous PowerShell get-command trouvera des exécutables n'importe où dans $Env:PATH.

get-command eventvwr

CommandType   Name          Definition
-----------   ----          ----------
Application   eventvwr.exe  c:\windows\system32\eventvwr.exe
Application   eventvwr.msc  c:\windows\system32\eventvwr.msc

Il trouve également des applets de commande Powerhell, des fonctions, des alias, des fichiers avec des extensions exécutables personnalisées via $Env:PATHEXT, etc défini pour le shell actuel (assez proche de bash type -a foo) - en faisant un meilleur go-to que d'autres outils comme where.exe, which.exe, etc, qui ne sont pas au courant de ces commandes PowerShell.

Vous pouvez rapidement configurer un alias avec sal which gcm (forme courte de set-alias which get-command).


105
2017-11-26 02:07



Dans Windows PowerShell:

set-alias which where.exe

39
2017-11-30 23:00



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

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

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


37
2017-11-20 05:16



le GnuWin32 les outils ont which, avec un tas d'autres outils Unix.


31
2017-11-20 06:44



Dans Windows CMD which appels where:

$ where php
C:\Program Files\PHP\php.exe

19
2018-04-01 12:02



Surpris que personne n'a mentionné cygwin comme une solution pour le moment. Si cela ne vous dérange pas d'utiliser une solution tierce, alors cygwin est la voie à suivre.

Cygwin vous donne le confort de * nix dans l'environnement Windows (et vous pouvez l'utiliser dans votre shell de commande Windows, ou utiliser un shell * nix de votre choix). Il vous donne une foule de commandes * nix (comme which) pour Windows, et vous pouvez simplement inclure ce répertoire dans votre PATH.


15
2017-10-12 17:02