Como encontro a localização de um executável no Windows?

154

Lembrei que usei uma ferramenta chamada wherepara encontrar locais para quaisquer programas executáveis ​​como este em um console:

 C:\Tmp\Where myTool.exe
 C:\Program Files\MyApp\myTools.exe
 ....

Agora não consigo encontrar esta ferramenta. Não tem certeza se o Windows possui uma ferramenta interna para fazer essa pesquisa?

David.Chu.ca
fonte
1
Várias respostas em cima Existe um equivalente de 'qual' no Windows? - Stack Overflow
Satanicpuppy
Se o aplicativo estiver em execução e você precisar saber sua localização, use o Process Explorer (da Sys Internals).
Ganesh R.
6
wheretrabalhou para mim no Windows 7 Enterprise
Bohemian
4
OP PAGING: Atualize resposta aceita :)
Jake
1
@ David.Chu.ca atualize resposta aceita
Matt Frear

Respostas:

351

De acordo com a resposta StackOverflow em Existe um equivalente de 'what' no Windows? , where.exefaz isso no Windows 7 e Windows Server 2003 e posterior:

Exemplo

C:\> where ping

Resultado:

C:\Windows\System32\PING.EXE
Simon D
fonte
19
Isto deve ser makred como a resposta correta como ele funciona sem instalar software extra
Cookies
25
Uma parte importante desta resposta é que no PowerShell, whereé um alias padrão para o Where-Object, para que em vez precisa usar where.exeou gcm/Get-Command
Dave Andersen
2
E o PowerShell. Como posso conseguir o mesmo no PowerShell?
krv
1
@krv Como o @DaveAndersen mencionou, no PowerShell você pode digitar Get-Command ping(ou apenas gcm ping), o que fornecerá o caminho completo, além de outras informações.
Sam
22

EDIT: eu deveria ter adicionado, se você não pode usar o comando WHERE no prompt de comando, verifique sua variável PATH. (Basta usar o comando "caminho".) Verifique se C: \ Windows \ System32 está no seu caminho. É aí que o "where.exe" está localizado.

ONDE está o comando que você está procurando! WHERE é como um cruzamento entre o shell "UN" incorporado do comando UNIX e o comando "localizar", na medida em que funciona para executáveis ​​de comando e arquivos regulares.

Também é um pouco mais complexo do que qualquer um desses dois, embora, em geral, um simples

WHERE <file>

vai funcionar.

É diferente do comando "localizar", pois não está visualizando todo o sistema de arquivos. Em vez disso, o comportamento padrão é procurar arquivos em dois locais:

  • O diretório atual.
  • Todos os diretórios na variável PATH.

Portanto, qualquer comando que você possa executar diretamente em um prompt de comandos sem especificar o diretório será encontrado pelo comando WHERE. (Porque qualquer comando como esse já está na lista de variáveis ​​PATH.)

Se você deseja pesquisar apenas na variável do caminho de comando, pode usar:

WHERE "$path:<search text>"

Se, por outro lado, você quiser encontrar todas as cópias de um arquivo em uma árvore de diretórios, poderá usar:

WHERE /R <Top Level Directory> <search text>

Finalmente, WHERE encontrará comandos e arquivos com uma extensão da variável PATHEXT sem incluir a extensão. Todos os outros arquivos devem ser especificados exatamente ou com curingas.

Tomemos, por exemplo, os arquivos "dxdiag.exe" e "dxdiagn.dll". Observe o seguinte comando e sua saída:

WHERE /R C:\Windows dxdiag

C:\Windows\System32\dxdiag.exe
C:\Windows\SysWOW64\dxdiag.exe
C:\Windows\WinSxS\amd64_microsoft-windows-d..x-directxdiagnostic_31bf3856ad364e35_6.2.9200.16384_none_7c8d3f96e7882ec7\dxdiag.exe
C:\Windows\WinSxS\x86_microsoft-windows-d..x-directxdiagnostic_31bf3856ad364e35_6.2.9200.16384_none_206ea4132f2abd91\dxdiag.exe

Consegue retornar todas as versões do "dxdiag.exe" porque ".exe" é uma das extensões na variável PATHEXT. (Nota: "WHERE dxdiag" também funcionaria, porque C: \ Windows \ System32 está na variável PATH.)

WHERE /R C:\Windows dxdiagn

por outro lado, falha ao retornar qualquer resultado, porque ".dll" não está no PATHEXT.

Nesse caso, observe o resultado que adicionar um curinga nos dá:

WHERE /R C:\Windows dxdiagn*

C:\Windows\System32\dxdiagn.dll
C:\Windows\System32\en-US\dxdiagn.dll.mui
C:\Windows\SysWOW64\dxdiagn.dll
C:\Windows\SysWOW64\en-US\dxdiagn.dll.mui
C:\Windows\WinSxS\amd64_microsoft-windows-d..iagnostic.resources_31bf3856ad364e35_6.2.9200.16384_en-us_daccd04369b09c70\dxdiagn.dll.mui
C:\Windows\WinSxS\amd64_microsoft-windows-d..x-directxdiagnostic_31bf3856ad364e35_6.2.9200.16384_none_7c8d3f96e7882ec7\dxdiagn.dll
C:\Windows\WinSxS\x86_microsoft-windows-d..iagnostic.resources_31bf3856ad364e35_6.2.9200.16384_en-us_7eae34bfb1532b3a\dxdiagn.dll.mui
C:\Windows\WinSxS\x86_microsoft-windows-d..x-directxdiagnostic_31bf3856ad364e35_6.2.9200.16384_none_206ea4132f2abd91\dxdiagn.dll

Ele retorna com êxito todas as versões do dxdiagn.dll.

Para mais informações, use "ONDE /?". Espero que isto ajude!

geo
fonte
2
where where C:\Windows\System32\where.exe:)
vp_arth
1
@vp_arth Estava pensando exatamente a mesma coisa :)
Reversed Engineer
10

use dir:

cd \
dir /s /b mytool.exe

a cd \peça muda para a raiz da unidade, para garantir que a pesquisa comece no topo da hierarquia.

John T
fonte
Parece fazer uma linha de comando do Windows Search.
Ganesh R.
5
Isso faz uma pesquisa recursiva da unidade e levaria uma eternidade.
djhowell
6
A única maneira de encontrar executáveis ​​que NÃO SÃO na variável de ambiente PATH é fazer isso. Ele nunca especificou seu caminho, ele disse que é executável .
John T
ele encontra o executável, mas demora um pouco.
Michael Z
Isto, obviamente, só funciona se você souber o nome do executável ou pelo menos uma parte do nome
Oliver Williams
9

Observe que algumas coisas podem ser um pouco diferentes para o PowerShell:

PS C:\Users\Rob.wb-devel> where ping

PS C:\Users\Rob.wb-devel> where git

PS C:\Users\Rob.wb-devel> whereis.bat git
C:\Program Files (x86)\Git\cmd\git.exe

PS C:\Users\Rob.wb-devel> where.exe git
C:\Program Files (x86)\Git\cmd\git.exe
Rob Jens
fonte
Obrigado, isso funciona para o cmd e o PowerShell
Ding-Yi Chen
3

Frustrante que não seja incorporado como um comando simples.

No entanto, existem várias soluções, uma das quais é um arquivo em lotes .

Crie um arquivo em lotes (which.bat) da seguinte maneira:

@setlocal
@set P2=.;%PATH%
@for %%e in (%PATHEXT%) do @for %%i in (%~n1%%e) do @if NOT "%%~$P2:i"=="" echo %%~$P2:i 

Ele procura no diretório local, pega um parâmetro de nome de arquivo com ou sem uma extensão e retorna a primeira correspondência do diretório atual ou no PATH.

Em seguida, execute-o como which cmd.exepara encontrar o cmd.exe que será executado se você digitar cmd.

bw
fonte
3

No Windows, você pode usar o utilitário gratuito Everything search engine para procurar instantaneamente qualquer arquivo por nome completo ou parcial (se o seu disco rígido estiver formatado em NTFS).

harrymc
fonte
1
Diferença de noite e dia entre essa pesquisa e a janela do Windows.
AnthonyVO
1

Se você quer apenas qual , o projeto GnuWin32 tem vários utilitários unix com instaladores individuais.

Apenas apaixonado
fonte
1

No PowerShell

(@($env:path.split(";")) + (pwd).Path)  | where { dir $_ -ErrorAction SilentlyContinue |? Name -eq foo.exe }

Você pode facilmente converter isso em um cmdlet.

Outra maneira de fazer isso, conforme sugerido em uma edição:

get-command notepad.exe | select Source
Anupam
fonte
0

Se você só precisa do caminho para iniciá-lo, geralmente é melhor usar o comando start. Por exemplo, você pode usar "start chrome.exe" para iniciar o Chrom {e | ium}, independentemente de onde ele esteja instalado.

Covarde anônimo
fonte
0

Heh, eu apenas tenho que postar este arquivo em lotes de liner deste Windows:

C:>type wh.cmd
@for %%f in (%*) do for %%e in (%PATHEXT% .dll .lnk) do for %%b in (%%f%%e) do for %%d in (%PATH%) do if exist %%d\%%b echo %%d\%%b

Um teste:

C:>wh ssh
C:\cygwin64\bin\ssh.EXE
C:\Windows\System32\OpenSSH\\ssh.EXE

Não é uma linha única se você incluir o código setlocal enableextensionse endlocal, que é necessário para usuários que não têm as extensões ativadas por padrão.

bobbogo
fonte