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

2

Se eu tiver um PATH longo e envolvido e digitar o nome de algum comando, como descobrir onde o arquivo EXE ou BAT realmente está. Eu pensei que o TRUENAME fez isso, mas ele saiu do XP e eu não tenho certeza se ele fez exatamente o que eu quero.

Então, eu quero ser capaz de 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. O que é chamado, ou pode ser feito com um arquivo de lote?

    
por rossmcm 23.08.2011 / 02:20

6 respostas

1

Aqui está um arquivo de lote do Windows que pesquisará o caminho de um arquivo. Eu testei no XP e no Win7.

Por favor, entenda que um arquivo batch / command 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.

Espero que seja bem comentado, mas sinta-se à 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
    
por 03.10.2014 / 17:05
4

Se você tem o GnuWin32 , é tão simples como:

which ObscureTool.exe

Melhor ainda, se você invocá-lo apenas pelo nome (sem extensão, como em "ObscureTool"), ele ainda encontrará a coisa certa. Isso pode ser um problema se você tiver dois arquivos "executáveis": "ObscureTool.exe" e "ObscureTool.bat". Nesse caso, WHICH encontrará o que ocorrer primeiro no caminho. Nesse caso, você simplesmente diria "

which ObscureTool
    
por 23.08.2011 / 03:03
4

Tudo depende do interpretador de comandos que está sendo executado e não há um utilitário externo que faça isso corretamente em todos os casos. Isto é por uma razão muito importante:

Different command interpreters look for commands in different ways.
Apenas um comando embutido em cada interpretador de comandos individual saberá verdadeiramente o que será invocado por um nome de comando específico.
  • Para JP Software TCC , basta usar < href="http://jpsoft.com/help/which.htm" title="WHICH"> seu comando which interno . Isso compreende os aliases do TCC, as extensões executáveis e o algoritmo de busca de caminho.
    [c:\]which mspaint dir
    mspaint is an external : C:\Windows\system32\mspaint.exe
    dir is an internal command
    [c:\]
  • Para o shell Korn, ksh , conforme disponível no Kit de ferramentas do utilitário SFUA (que é executado no Subsistema para Aplicativos Baseados em UNIX que vem ali na caixa com Windows 7 Ultimate Edition e Windows Server 2008 R2) use seu comando whence interno . Isso compreende os aliases, funções, comandos incorporados do shell Korn e assim por diante.
    $ whence -v ls
    ls is a tracked alias for /bin/ls
    $
  • Para o shell Bourne-Again, bash , como disponível para Serviços para aplicativos Unix , bem como no Cygwin, use o comando type integrado. Isso compreende os aliases, funções, comandos internos do shell Boune-Again e assim por diante.
    $ type '['
    [ is a shell builtin
    $
  • Para o interpretador de comandos da Microsoft, cmd , você está sem sorte. Não há comando embutido para fazer isso; e embora seja possível empregar comandos externos que replicarão o algoritmo de busca de caminho, esses comandos não necessariamente (ou mesmo geralmente) reconhecerão aliases e comandos internos. Por exemplo: Aqui está o comando GnuWin32 which failing para reconhecer dir (em contraste com o comando which integrado do TCC acima):
    C:\>which dir
    which: no dir in (.;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem)
    C:\>
    E aqui está o comando where mencionado por grawity abaixo, falhando exatamente da mesma maneira:
    C:\>where dir
    INFO: Could not find files for the given pattern(s).
    C:\>
por 27.08.2011 / 16:29
3

Usando o powershell, você pode usar o Get-Command tool.exe

    
por 23.08.2011 / 02:29
3

Eu estou executando o Windows 7 regular e simplesmente digitando "onde java.exe" parece funcionar muito bem sem qualquer software adicional.

    
por 31.05.2013 / 11:25
2

Você pode usar o 'dir', a ferramenta de listagem de diretórios:

dir "c:\Obscure Tool.exe" /s/b

O / s significa subdiretórios de pesquisa e, como você está iniciando na pasta raiz (C :), ele pesquisará todas as pastas dessa unidade.
O / b faz com que ele exiba o resultado no formato "bare" sem informações de cabeçalho ou resumo (isto é, você só obterá o caminho e o nome do arquivo).

    
por 23.08.2011 / 02:25