¿Cómo puedo saber la ruta real a un archivo EXE o BAT?

¿Cómo puedo saber la ruta real a un archivo EXE o BAT?

Si tengo una RUTA larga y complicada y escribo el nombre de algún comando, ¿cómo puedo saber dónde se encuentra realmente el archivo EXE o BAT? Pensé que TRUENAME hizo esto, pero ya no está en XP y no estoy seguro de que haya hecho exactamente lo que quiero.

Entonces quiero poder escribir

WHEREIS "Obscure Tool.exe"

y obtengo:

C:\Program Files\Obscure Tools Limited\Obscure Tool\Obscure Tool.exe

cuando la carpeta C:\Program Files\Obscure Tools Limited\Obscure Tool\está en mi camino. ¿Cómo se llama WHEREIS o se puede hacer con un archivo por lotes?

Respuesta1

Aquí hay un archivo por lotes de Windows que buscará un archivo en su ruta. Lo probé en XP y Win7.

Por favor, comprenda que un archivo por lotes/comando NO es una buena solución para este problema porque la manipulación de cadenas es tremendamente lenta, pero en lugar de una herramienta compilada, esto hará lo que usted desea.

Con suerte, se comenta lo suficientemente bien, pero no dude en hacer preguntas si necesita alguna aclaración.

@echo off

SETLOCAL ENABLEDELAYEDEXPANSION

rem -- SRC = Search value. Eg. notepad  or  notepad.exe
rem -- PAT = A copy of the path
rem -- SEP = PATH seperator
rem -- EXE = Executable file extensions
SET TMP_SRC=%1
SET TMP_PAT=%PATH%
SET TMP_SEP=;
SET TMP_EXE=exe com bat cmd

rem -- This is a batch file ...they are s-l-o-w
rem -- "<nul set /p=" does "echo" without a newline
<nul set /p =Searching...

:strLoop
    rem -- SUB = The first entry in the current PATH
    for /f "delims=%TMP_SEP%" %%s in ("!TMP_PAT!") do set TMP_SUB=%%s

    rem -- Progress update
    <nul set /p =.

    rem -- Check for the file exactly as specified on the command line
    if exist "!TMP_SUB!\%TMP_SRC%" (
        echo.
        echo Found "!TMP_SUB!\%TMP_SRC%"
        goto strDone
    )

    rem -- Check for the file with each of the selected executable extensions
    for %%x in (%TMP_EXE%) do (
        if exist "!TMP_SUB!\%TMP_SRC%.%%x" (
            echo.
            echo Found "!TMP_SUB!\%TMP_SRC%.%%x"
            goto strDone
        )
    )

    rem -- This loop chops off the first entry of the PATH
:subLoop
    rem -- CHR = First character of current PATH
    rem -- PAT -> All but the first character of the current PATH
    set TMP_CHR=!TMP_PAT:~0,1!
    set TMP_PAT=!TMP_PAT:~1!

    rem -- Have we exhausted the PATH?
    if "!TMP_PAT!" EQU "" goto strDone

    rem -- Have we just removed a PATH seperator?
    if "!TMP_CHR!" EQU "%TMP_SEP%" goto strLoop

    rem -- Keep stripping characters
    goto subLoop
:strDone

rem -- Cleanup
SET TMP_SRC=
SET TMP_PAT=
SET TMP_SEP=
SET TMP_SUB=
SET TMP_CHR=
SET TMP_EXE=

ENDLOCAL

Respuesta2

Todo depende del intérprete de comandos que se esté ejecutando y no existe una utilidad externa que lo haga correctamente en todos los casos. Esto se debe a una razón muy importante:

Diferentes intérpretes de comandos buscan comandos de diferentes maneras.
Sólo un comando integrado en cada intérprete de comandos individual sabrá realmente qué se invocará con un nombre de comando en particular.

  • ParaTCC de JP Software, simplemente usawhichsu comando incorporado. Esto comprende los alias, las extensiones ejecutables y el algoritmo de búsqueda de rutas de TCC.
    [c:\]qué directorio mspaint
    mspaint es externo: C:\Windows\system32\mspaint.exe
    dir es un comando interno
    [C:\]
  • Para la cáscara de Korn ksh,como está disponible en elKit de herramientas de utilidad SFUA(que se ejecutan en elSubsistema para aplicaciones basadas en UNIXque viene en la caja con Windows 7 Ultimate Edition y Windows Server 2008 R2) usewhencesu comando incorporado. Esto comprende los alias, funciones, comandos integrados, etc. del shell Korn.
    $ de donde -v ls
    ls es un alias rastreado para /bin/ls
    $
  • Para el shell Bourne-Again bash,comodisponible para Servicios para Aplicaciones Unixasí como en Cygwin, use su comando incorporado type. Esto comprende los alias, funciones, comandos integrados, etc. del shell Boune-Again.
    $ escribe '['
    [es un shell incorporado
    $
  • Para el intérprete de comandos de Microsoft cmd,no tienes suerte. No hay ningún comando integrado para hacer esto; y aunque se puede emplearexternocomandos que replicarán el algoritmo de búsqueda de ruta, esos comandos no necesariamente (o incluso normalmente) reconocerán alias y comandos integrados. Por ejemplo: aquí está el whichcomando GnuWin32defectoreconocer dir(en contraste con el comando integrado de TCC whichanterior):
    C:\>qué directorio
    cual: no hay directorio en (.;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem)
    C:\>
    Y aquí está el wherecomando mencionado a grawitycontinuación que falla exactamente de la misma manera:
    C:\>donde directorio
    INFORMACIÓN: No se pudieron encontrar archivos para los patrones dados.
    C:\>

Respuesta3

Si usted tieneGnuWin32es tan simple como:

which ObscureTool.exe

Aún mejor, si lo invocas sólo por su nombre (sin una extensión, como en "ObscureTool"), aún encontrará lo correcto. Esto podría ser un problema si tienesdosArchivos "ejecutables": "ObscureTool.exe" y "ObscureTool.bat". En este caso,CUALencontrará el que ocurreprimeroen el camino. En este caso, simplemente dirías"

which ObscureTool

Respuesta4

Usando powershell puedes usar elGet-Command tool.exe

información relacionada