Trouver le chemin du programme qui s'exécutera à partir de la ligne de commande sous Windows

128

Disons que j'ai un programme X.EXEinstallé dans un dossier c:\abcd\happy\sur le système. Le dossier se trouve sur le chemin du système. Supposons maintenant qu'il existe un autre programme sur le système, également appelé X.EXE, mais installé dans un dossier c:\windows\.

Est-il possible de savoir rapidement à partir de la ligne de commande que si je tape X.EXElequel des deux X.EXEsera lancé? (mais sans avoir à rechercher dans le répertoire ou à consulter les détails du processus dans le Gestionnaire des tâches).

Peut-être une sorte de commande intégrée, ou un programme qui peut faire quelque chose comme ça? :

detect_program_path X.EXE
Zabba
la source
2
Double-possible de Y a
Michael Freidgeim

Réponses:

239

Utilisez la wherecommande. Le premier résultat de la liste est celui qui s'exécutera.

C: \> où le bloc-notes
C: \ Windows \ System32 \ notepad.exe
C: \ Windows \ notepad.exe

Selon ce billet de blog , where.exeest inclus avec Windows Server 2003 et versions ultérieures, donc cela devrait fonctionner uniquement avec Vista, Win 7, et al.

Sous Linux, l'équivalent est la whichcommande, par exemple which ssh.

Chris Schmich
la source
2
+1! Je n'ai jamais su que cela pouvait faire partie de Windows et je n'ai donc pas regardé dans cette direction! :)
Zabba
1
Un équivalent pour les pauvres utilisateurs de XP?
shahar_m
@shahar_m: avez-vous essayé le script ci-dessous de Michael Burr? Ce n'est pas intégré, mais cela peut faire ce dont vous avez besoin.
Chris Schmich
1
@Kenny: en supposant que vous connaissez le nom de la DLL, vous pouvez utiliser l'utilitaire ListDLLs ( technet.microsoft.com/en-us/sysinternals/bb896656 ). À partir de la ligne de commande, exécutez simplement listdlls -d foo.dllpour voir tous les processus sur lesquels le module est chargé et le chemin complet du module chargé. Alternativement, vous pouvez simplement faire une recherche de fichier Windows pour le nom du fichier.
Chris Schmich
2
@Kenny: Ce que vous demandez est très différent de la réponse publiée ici. Vous devez créer une nouvelle question Stack Overflow avec les recherches que vous avez effectuées et publier un lien vers celle-ci dans ces commentaires.
Chris Schmich
10

Voici un petit script cmd que vous pouvez copier-coller dans un fichier nommé quelque chose comme where.cmd:

@echo off
rem - search for the given file in the directories specified by the path, and display the first match
rem
rem    The main ideas for this script were taken from Raymond Chen's blog:
rem
rem         http://blogs.msdn.com/b/oldnewthing/archive/2005/01/20/357225.asp
rem
rem
rem - it'll be nice to at some point extend this so it won't stop on the first match. That'll
rem     help diagnose situations with a conflict of some sort.
rem

setlocal

rem - search the current directory as well as those in the path
set PATHLIST=.;%PATH%
set EXTLIST=%PATHEXT%

if not "%EXTLIST%" == "" goto :extlist_ok
set EXTLIST=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
:extlist_ok

rem - first look for the file as given (not adding extensions)
for %%i in (%1) do if NOT "%%~$PATHLIST:i"=="" echo %%~$PATHLIST:i

rem - now look for the file adding extensions from the EXTLIST
for %%e in (%EXTLIST%) do @for %%i in (%1%%e) do if NOT "%%~$PATHLIST:i"=="" echo %%~$PATHLIST:i
Michael Burr
la source
8

Comme le fil mentionné dans le commentaire, get-commanddans PowerShell peut également le résoudre. Par exemple, vous pouvez taper get-command npmet la sortie est comme ci-dessous:

entrez la description de l'image ici

Eugène
la source
(get-command npm).Sourcerépondra avec juste le chemin vers npm (pour l'exemple) au lieu de la table entière de toutes les propriétés.
David Brown