Encontrar la ruta del programa que se ejecutará desde la línea de comandos en Windows

128

Digamos que tengo un programa X.EXEinstalado en la carpeta c:\abcd\happy\del sistema. La carpeta está en la ruta del sistema. Ahora suponga que hay otro programa en el sistema que también se llama X.EXE pero está instalado en la carpeta c:\windows\.

¿Es posible descubrir rápidamente desde la línea de comandos que si escribo X.EXEcuál de los dos X.EXEse lanzará? (pero sin tener que buscar ni mirar los detalles del proceso en el Administrador de tareas).

¿Tal vez algún tipo de comando incorporado, o algún programa que pueda hacer algo como esto? :

detect_program_path X.EXE
Zabba
fuente

Respuestas:

239

Usa el wherecomando. El primer resultado en la lista es el que se ejecutará.

C: \> donde el bloc de notas
C: \ Windows \ System32 \ notepad.exe
C: \ Windows \ notepad.exe

De acuerdo con esta publicación de blog , where.exese incluye con Windows Server 2003 y versiones posteriores, por lo que esto debería funcionar con Vista, Win 7 y otros.

En Linux, el equivalente es el whichcomando, por ejemplo which ssh.

Chris Schmich
fuente
2
+1! ¡Nunca supe que esto podría haber sido parte de Windows, así que no miré en esa dirección! :)
Zabba
1
¿Algún equivalente para los usuarios pobres de XP?
shahar_m
@shahar_m: ¿probaste el siguiente script de Michael Burr? No está integrado, pero puede hacer lo que necesita.
Chris Schmich
1
@Kenny: suponiendo que conozca el nombre de la DLL, puede usar la utilidad ListDLLs ( technet.microsoft.com/en-us/sysinternals/bb896656 ). Desde la línea de comandos, simplemente ejecute listdlls -d foo.dllpara ver todos los procesos que tienen el módulo cargado y la ruta completa al módulo cargado. Alternativamente, puede hacer una búsqueda de archivos de Windows para el nombre del archivo.
Chris Schmich
2
@Kenny: Lo que estás pidiendo es muy diferente de la respuesta publicada aquí. Debe crear una nueva pregunta de desbordamiento de pila con la investigación que ha realizado y publicar un enlace a ella en estos comentarios.
Chris Schmich
10

Aquí hay un pequeño script de cmd que puede copiar y pegar en un archivo llamado algo así como 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
fuente
8

Como el hilo mencionado en el comentario, get-commanden powershell también puede solucionarlo. Por ejemplo, puede escribir get-command npmy la salida es la siguiente:

ingrese la descripción de la imagen aquí

Eugene
fuente
(get-command npm).Sourceresponderá solo con la ruta a npm (por ejemplo) en lugar de la tabla completa de todas las propiedades.
David Brown el