Pregunta ¿Hay un equivalente de 'que' en la línea de comandos de Windows?


Como a veces tengo problemas de ruta, donde uno de mis propios scripts cmd está oculto (sombreado) por otro programa (anteriormente en la ruta), me gustaría poder encontrar la ruta completa a un programa en la línea de comandos de Windows, dada solo su nombre

¿Hay un equivalente al comando UNIX 'que'?

En UNIX, which command imprime la ruta completa del comando dado para encontrar y reparar fácilmente estos problemas de sombreado.


1896
2017-11-20 04:19


origen


Respuestas:


Windows Server 2003 y posterior (es decir, cualquier cosa posterior a Windows XP de 32 bits) proporcionan la where.exe programa que hace algo de lo which lo hace, aunque coincide con todos los tipos de archivos, no solo con los comandos ejecutables. (No coincide con los comandos integrados de shell como cd.) Incluso aceptará comodines, por lo que where nt* encuentra todos los archivos en su %PATH% y el directorio actual cuyos nombres comienzan con nt.

Tratar where /? por ayuda

Tenga en cuenta que Windows PowerShell define where como un alias para el Where-Object cmdletEntonces, si quieres where.exe, debe escribir el nombre completo en lugar de omitir el .exe extensión.


2103
2017-11-20 05:52



Mientras que las versiones posteriores de Windows tienen una where comando, también puede hacer esto con Windows XP utilizando los modificadores de la variable de entorno, de la siguiente manera:

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

No necesita herramientas adicionales y no está limitado a PATH ya que puede sustituir cualquier variable de entorno (en el formato de ruta, por supuesto) que desee utilizar.


Y, si quieres uno que pueda manejar todas las extensiones en PATHEXT (como Windows mismo), este hace el truco:

@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

De hecho, devuelve todas las posibilidades, pero puede modificarlo bastante fácilmente para reglas de búsqueda específicas.


256
2017-11-20 05:48



En PowerShell get-command encontrará ejecutables en cualquier lugar de $Env:PATH.

get-command eventvwr

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

También encuentra los cmdlets de powershell, funciones, alias, archivos con extensiones ejecutables personalizadas a través de $Env:PATHEXT, etc. definido para el shell actual (bastante parecido al de bash type -a foo) - haciéndolo mejor que otras herramientas como where.exe, which.exe, etc. que no conocen estos comandos de PowerShell.

Puede configurar rápidamente un alias con sal which gcm (forma corta de set-alias which get-command)


105
2017-11-26 02:07



En Windows PowerShell:

set-alias which where.exe

39
2017-11-30 23:00



Si tiene instalado PowerShell (que recomiendo), puede usar el siguiente comando como un equivalente aproximado (sustituya programName por el nombre de su ejecutable):

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

Más aquí: http://www.codeassassin.com/blog/PermaLink,guid,fd1967d1-f844-4e29-82e2-f2d6424b4ef9.aspx


37
2017-11-20 05:16



los GnuWin32 herramientas tienen which, junto con una gran cantidad de otras herramientas de Unix.


31
2017-11-20 06:44



En Windows CMD which llamadas where:

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

19
2018-04-01 12:02



Sorprendido de que nadie haya mencionado cygwin como una solución aún. Si no te importa usar una solución de terceros, entonces cygwin es el camino a seguir.

Cygwin le brinda la comodidad de * nix en el entorno de Windows (y puede usarlo en el shell de comandos de Windows, o usar un shell * nix de su elección). Te da una gran cantidad de comandos * nix (como which) para Windows, y usted puede simplemente incluir ese directorio en su PATH.


15
2017-10-12 17:02



En PowerShell, es gcm, que proporciona información formateada sobre otros comandos. Si desea recuperar solo la ruta al ejecutable, use .Source.

Por ejemplo: gcm git o (gcm git).Source

Tidbits:


11
2017-09-11 11:32



Ve a obtener desentendimientos de aquí: http://sourceforge.net/projects/unxutils/

oro en plataformas de Windows, pone todas las utilidades agradables de Unix en un Windows estándar DOS. Lo he estado usando por años.

Tiene un 'que' incluido. Tenga en cuenta que es sensible a las mayúsculas o minúsculas.

NB: para instalarlo explote el zip en alguna parte y agregue ... \ UnxUtils \ usr \ local \ wbin \ a su variable de entorno de ruta del sistema.


8
2018-03-26 00:08