Como posso descobrir o caminho real para um arquivo EXE ou BAT?

Como posso descobrir o caminho real para um arquivo EXE ou BAT?

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 usarwhichseu 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) usewhenceseu 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 integrado type. 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á o whichcomando GnuWin32falhandoreconhecer dir(em contraste com o comando integrado do TCC whichacima):
    C:\>qual diretório
    qual: nenhum diretório em (.;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem)
    C:\>
    E aqui está o wherecomando mencionado grawityabaixo 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

informação relacionada