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 usa
which
su 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) usewhence
su 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 incorporadotype
. 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á elwhich
comando GnuWin32defectoreconocerdir
(en contraste con el comando integrado de TCCwhich
anterior):C:\>qué directorio cual: no hay directorio en (.;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem) C:\>
Y aquí está elwhere
comando mencionado agrawity
continuació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