¿Cómo encuentro la ubicación de un ejecutable en Windows?

154

Recordé que usé una herramienta llamada wherepara encontrar ubicaciones para cualquier programa ejecutable como este en una consola:

 C:\Tmp\Where myTool.exe
 C:\Program Files\MyApp\myTools.exe
 ....

Ahora no puedo encontrar esta herramienta. ¿No está seguro si Windows tiene una herramienta integrada para hacer esa búsqueda?

David.Chu.ca
fuente
1
Varias respuestas sobre ¿Hay un equivalente de 'cuál' en Windows? - Stack Overflow
Satanicpuppy
SI la aplicación se está ejecutando y necesita conocer su ubicación, use Process Explorer (de Sys Internals).
Ganesh R.
66
wherefuncionó para mí en Windows 7 Enterprise
Bohemian
44
PAGING OP: Actualiza la respuesta aceptada :)
Jake
1
@ David.Chu.ca por favor actualice la respuesta aceptada
Matt Frear

Respuestas:

351

De acuerdo con la respuesta de StackOverflow en ¿Hay un equivalente de 'cuál' en Windows? , where.exehace esto en Windows 7 y Windows Server 2003 y posterior:

Ejemplo

C:\> where ping

Salida:

C:\Windows\System32\PING.EXE
Simon D
fuente
19
Esto debería ser considerado como la respuesta correcta, ya que funciona sin instalar software adicional
Cookie
25
Una parte importante de esta respuesta es que, en PowerShell, wherees un alias predeterminado para el Where-Object, por lo que debe usar where.exe, o gcm/Get-Command
Dave Andersen
2
¿Qué pasa con PowerShell? ¿Cómo puedo lograr lo mismo en powershell?
krv
1
@krv Como mencionó @DaveAndersen, en powershell puede escribir Get-Command ping(o simplemente gcm ping), lo que le dará la ruta completa, junto con alguna otra información.
Sam
22

EDITAR: Debería haber agregado, si no puede usar el comando WHERE desde el símbolo del sistema, verifique su variable PATH. (Simplemente use el comando "ruta"). Asegúrese de que C: \ Windows \ System32 esté en su ruta. Ahí es donde se encuentra "where.exe".

¡DÓNDE está el comando que estás buscando! WHERE es como un cruce entre el shell incorporado de UNIX "which" y el comando "localizar", en el sentido de que funciona tanto para ejecutables de comandos como para archivos normales.

También es algo más complejo que cualquiera de esos dos, aunque, en general, un simple

WHERE <file>

trabajará.

Es diferente del comando "localizar" en que no está mirando a través de todo el sistema de archivos. En cambio, el comportamiento predeterminado es buscar archivos en dos ubicaciones:

  • El directorio actual.
  • Todos los directorios en la variable PATH.

Por lo tanto, el comando WHERE encontrará cualquier comando que pueda ejecutar directamente desde un símbolo del sistema sin especificar el directorio. (Porque cualquier comando como ese ya está en la lista de variables PATH).

Si desea buscar solo en la variable de ruta de comando, puede usar:

WHERE "$path:<search text>"

Si, por otro lado, desea encontrar todas las copias de un archivo en un árbol de directorios, puede usar:

WHERE /R <Top Level Directory> <search text>

Finalmente, WHERE encontrará comandos y cualquier archivo con una extensión de la variable PATHEXT sin incluir la extensión. Todos los demás archivos deben especificarse exactamente o con comodines.

Tomemos, por ejemplo, los archivos "dxdiag.exe" y "dxdiagn.dll". Tenga en cuenta el siguiente comando y su salida:

WHERE /R C:\Windows dxdiag

C:\Windows\System32\dxdiag.exe
C:\Windows\SysWOW64\dxdiag.exe
C:\Windows\WinSxS\amd64_microsoft-windows-d..x-directxdiagnostic_31bf3856ad364e35_6.2.9200.16384_none_7c8d3f96e7882ec7\dxdiag.exe
C:\Windows\WinSxS\x86_microsoft-windows-d..x-directxdiagnostic_31bf3856ad364e35_6.2.9200.16384_none_206ea4132f2abd91\dxdiag.exe

Logra devolver todas las versiones de "dxdiag.exe" porque ".exe" es una de las extensiones de la variable PATHEXT. (Nota: "WHERE dxdiag" también habría funcionado, porque C: \ Windows \ System32 está en la variable PATH).

WHERE /R C:\Windows dxdiagn

por otro lado, no devuelve ningún resultado, porque ".dll" no está en PATHEXT.

En este caso, observe el resultado que nos proporciona agregar un comodín:

WHERE /R C:\Windows dxdiagn*

C:\Windows\System32\dxdiagn.dll
C:\Windows\System32\en-US\dxdiagn.dll.mui
C:\Windows\SysWOW64\dxdiagn.dll
C:\Windows\SysWOW64\en-US\dxdiagn.dll.mui
C:\Windows\WinSxS\amd64_microsoft-windows-d..iagnostic.resources_31bf3856ad364e35_6.2.9200.16384_en-us_daccd04369b09c70\dxdiagn.dll.mui
C:\Windows\WinSxS\amd64_microsoft-windows-d..x-directxdiagnostic_31bf3856ad364e35_6.2.9200.16384_none_7c8d3f96e7882ec7\dxdiagn.dll
C:\Windows\WinSxS\x86_microsoft-windows-d..iagnostic.resources_31bf3856ad364e35_6.2.9200.16384_en-us_7eae34bfb1532b3a\dxdiagn.dll.mui
C:\Windows\WinSxS\x86_microsoft-windows-d..x-directxdiagnostic_31bf3856ad364e35_6.2.9200.16384_none_206ea4132f2abd91\dxdiagn.dll

Devuelve con éxito todas las versiones de dxdiagn.dll.

Para obtener más información, use "WHERE /?". ¡Espero que esto ayude!

geo
fuente
2
where where C:\Windows\System32\where.exe:)
vp_arth
1
@vp_arth Estaba pensando exactamente lo mismo :)
Ingeniero invertido
10

uso dir:

cd \
dir /s /b mytool.exe

la cd \parte lo cambia a la raíz del disco, para garantizar que la búsqueda comience en la parte superior de la jerarquía.

John T
fuente
Parece que está haciendo una línea de comando de búsqueda de Windows.
Ganesh R.
55
Eso hace una búsqueda recursiva del disco y llevaría una eternidad.
djhowell
66
La única forma de encontrar ejecutables que NO ESTÁN en la variable de entorno PATH es hacer esto. Nunca especificó su camino, dijo que cualquier ejecutable .
John T
encuentra el ejecutable pero lleva un tiempo.
Michael Z
esto, por supuesto, solo funciona si conoce el nombre del ejecutable o al menos una parte del nombre
Oliver Williams
9

Tenga en cuenta que algunas cosas pueden ser un poco diferentes para PowerShell:

PS C:\Users\Rob.wb-devel> where ping

PS C:\Users\Rob.wb-devel> where git

PS C:\Users\Rob.wb-devel> whereis.bat git
C:\Program Files (x86)\Git\cmd\git.exe

PS C:\Users\Rob.wb-devel> where.exe git
C:\Program Files (x86)\Git\cmd\git.exe
Rob Jens
fuente
Gracias, esto funciona tanto para cmd como para PowerShell
Ding-Yi Chen
3

Frustrante que no está integrado como un simple comando.

Sin embargo, hay varias soluciones, una de las cuales es un archivo por lotes .

Cree un archivo por lotes (which.bat) de la siguiente manera:

@setlocal
@set P2=.;%PATH%
@for %%e in (%PATHEXT%) do @for %%i in (%~n1%%e) do @if NOT "%%~$P2:i"=="" echo %%~$P2:i 

Esto se ve en el directorio local, tomará un parámetro de nombre de archivo con o sin una extensión, y devolverá la primera coincidencia del directorio actual o en la RUTA.

Luego ejecútelo como which cmd.exepara encontrar el cmd.exe que se ejecutará si escribe cmd.

bw
fuente
3

En Windows, puede utilizar la utilidad gratuita Todo el motor de búsqueda para buscar instantáneamente cualquier archivo por nombre completo o parcial (si su disco duro está formateado en ntfs).

harrymc
fuente
1
Diferencia de día y noche entre esto y la búsqueda de Windows.
AnthonyVO
1

En PowerShell

(@($env:path.split(";")) + (pwd).Path)  | where { dir $_ -ErrorAction SilentlyContinue |? Name -eq foo.exe }

Puede convertir esto fácilmente en un Cmdlet.

Otra forma de lograr esto, como se sugiere en una edición:

get-command notepad.exe | select Source
Anupam
fuente
0

Si solo necesita la ruta para iniciarlo, a menudo es mejor usar el comando de inicio. Por ejemplo, puede usar "start chrome.exe" para iniciar Chrom {e | ium}, independientemente de dónde esté instalado.

Cobarde anónimo
fuente
0

Heh, solo tengo que publicar este archivo por lotes de un revestimiento de Windows:

C:>type wh.cmd
@for %%f in (%*) do for %%e in (%PATHEXT% .dll .lnk) do for %%b in (%%f%%e) do for %%d in (%PATH%) do if exist %%d\%%b echo %%d\%%b

Una prueba:

C:>wh ssh
C:\cygwin64\bin\ssh.EXE
C:\Windows\System32\OpenSSH\\ssh.EXE

No es una línea si se incluye el código setlocal enableextensionsy endlocal, que son necesarios para los usuarios que no tienen habilitadas las extensiones de forma predeterminada.

bobbogo
fuente