Se eu tiver um PATH longo e complicado e digitar o nome de algum comando, como faço para descobrir onde o arquivo EXE ou BAT realmente reside. Achei que TRUENAME fez isso, mas saiu do XP e não tenho certeza se fez exatamente o que eu queria.
Então eu quero poder digitar
WHEREIS "Obscure Tool.exe"
e eu recebo:
C:\Program Files\Obscure Tools Limited\Obscure Tool\Obscure Tool.exe
quando a pasta C:\Program Files\Obscure Tools Limited\Obscure Tool\
está no meu caminho. Como é chamado WHEREIS ou pode ser feito com um arquivo em lote?
Responder1
Aqui está um arquivo em lote do Windows que irá procurar um arquivo em seu caminho. Eu testei no XP e no Win7.
Por favor, entenda que um arquivo em lote/comando NÃO é uma boa solução para este problema porque a manipulação de strings é dolorosamente lenta - mas em vez de uma ferramenta compilada, isso fará o que você deseja.
Esperamos que tenha sido bem comentado, mas fique à vontade para fazer perguntas se algo precisar de esclarecimento.
@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
Responder2
Tudo depende de qual interpretador de comandos está sendo executado, e não existe um utilitário externo que faça isso corretamente em todos os casos. Isto ocorre por um motivo muito importante:
Diferentes interpretadores de comandos procuram comandos de maneiras diferentes.Somente um comando incorporado em cada interpretador de comando individual saberá realmente o que será invocado por um nome de comando específico.
- ParaTCC da JP Software, basta usar
which
seu comando embutido. Isso compreende os aliases, extensões executáveis e algoritmo de busca de caminho do TCC.[c:\]qual diretório mspaint mspaint é externo: C:\Windows\system32\mspaint.exe dir é um comando interno [c:\]
- Para a concha Korn
ksh
,conforme disponível noKit de ferramentas do utilitário SFUA(que funcionam noSubsistema para aplicativos baseados em UNIXque vem na caixa com o Windows 7 Ultimate Edition e o Windows Server 2008 R2) usewhence
seu comando embutido. Isso entende os aliases, funções, comandos integrados do shell Korn e assim por diante.$ de onde -v ls ls é um alias rastreado para /bin/ls $
- Para o shell Bourne-Again
bash
,comodisponível para serviços para aplicativos Unixassim como no Cygwin, use seu comando integradotype
. Isso entende os aliases, funções, comandos integrados do shell Boune-Again e assim por diante.$ digite '[' [é um shell embutido $
- Para o interpretador de comandos da Microsoft,
cmd
,Você não está com sorte. Não há comando interno para fazer isso; e embora se possa empregarexternocomandos que replicarão o algoritmo de busca de caminho, esses comandos não reconhecerão necessariamente (ou mesmo normalmente) aliases e comandos integrados. Por exemplo: Aqui está owhich
comando GnuWin32falhandoreconhecerdir
(em contraste com o comando integrado do TCCwhich
acima):C:\>qual diretório qual: nenhum diretório em (.;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem) C:\>
E aqui está owhere
comando mencionadograwity
abaixo falhando exatamente da mesma maneira:C:\>onde diretório INFO: Não foi possível encontrar arquivos para o(s) padrão(s) fornecido(s). C:\>
Responder3
Se você temGnuWin32é tão simples quanto:
which ObscureTool.exe
Melhor ainda, se você o invocar apenas pelo nome (sem extensão, como em "ObscureTool"), ele ainda encontrará a coisa certa. Isso pode ser um problema se você tiverdoisArquivos "executáveis": "ObscureTool.exe" e "ObscureTool.bat". Nesse caso,QUALencontrará o que ocorreprimeirono caminho. Neste caso, você simplesmente diria"
which ObscureTool
Responder4
Usando o PowerShell você pode usar oGet-Command tool.exe