Localizando o caminho do programa que será executado na linha de comando no Windows

128

Digamos que eu tenha um programa X.EXEinstalado na pasta c:\abcd\happy\do sistema. A pasta está no caminho do sistema. Agora, suponha que exista outro programa no sistema que também seja chamado X.EXE, mas esteja instalado na pasta c:\windows\.

É possível descobrir rapidamente na linha de comando que se eu digitar X.EXEqual dos dois X.EXEserá lançado? (mas sem precisar direcionar a pesquisa ou examinar os detalhes do processo no Gerenciador de tarefas).

Talvez algum tipo de comando embutido, ou algum programa por aí que possa fazer algo assim? :

detect_program_path X.EXE
Zabba
fonte
2
Possível duplicata de Existe um equivalente de 'qual' na linha de comando do Windows?
Michael Freidgeim

Respostas:

239

Use o wherecomando O primeiro resultado da lista é o que será executado.

C: \> onde o bloco de notas
C: \ Windows \ System32 \ notepad.exe
C: \ Windows \ notepad.exe

De acordo com este post do blog , where.exeestá incluído no Windows Server 2003 e posterior; portanto, isso deve funcionar apenas com o Vista, Win 7, et al.

No Linux, o equivalente é o whichcomando, por exemplo which ssh.

Chris Schmich
fonte
2
+1! Eu nunca soube que isso poderia fazer parte do Windows e, portanto, não olhei nessa direção! :)
Zabba
1
Qualquer equivalente para os usuários xp pobres?
precisa saber é o seguinte
@shahar_m: você tentou o script abaixo de Michael Burr? Não está embutido, mas pode fazer o que você precisa.
31411 Chris Schmich
1
@ Kenen: Supondo que você saiba o nome da DLL, você pode usar o utilitário ListDLLs ( technet.microsoft.com/en-us/sysinternals/bb896656 ). Na linha de comando, basta executar listdlls -d foo.dllpara ver todos os processos que têm o módulo carregado e o caminho completo para o módulo carregado. Como alternativa, você pode apenas fazer uma pesquisa de arquivo do Windows pelo nome do arquivo.
Chris Schmich
2
@ Kenny: O que você está pedindo é muito diferente da resposta postada aqui. Você deve criar uma nova pergunta de estouro de pilha com as pesquisas que fez e postar um link nesses comentários.
21420 Chris Schmich
10

Aqui está um pequeno script cmd que você pode copiar e colar em um arquivo chamado algo como where.cmd:

@echo off
rem - search for the given file in the directories specified by the path, and display the first match
rem
rem    The main ideas for this script were taken from Raymond Chen's blog:
rem
rem         http://blogs.msdn.com/b/oldnewthing/archive/2005/01/20/357225.asp
rem
rem
rem - it'll be nice to at some point extend this so it won't stop on the first match. That'll
rem     help diagnose situations with a conflict of some sort.
rem

setlocal

rem - search the current directory as well as those in the path
set PATHLIST=.;%PATH%
set EXTLIST=%PATHEXT%

if not "%EXTLIST%" == "" goto :extlist_ok
set EXTLIST=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
:extlist_ok

rem - first look for the file as given (not adding extensions)
for %%i in (%1) do if NOT "%%~$PATHLIST:i"=="" echo %%~$PATHLIST:i

rem - now look for the file adding extensions from the EXTLIST
for %%e in (%EXTLIST%) do @for %%i in (%1%%e) do if NOT "%%~$PATHLIST:i"=="" echo %%~$PATHLIST:i
Michael Burr
fonte
8

Como o thread mencionado no comentário, get-commandno PowerShell também pode resolver isso. Por exemplo, você pode digitar get-command npme a saída é a seguinte:

insira a descrição da imagem aqui

Eugene
fonte
(get-command npm).Sourceresponderá apenas com o caminho para npm (por exemplo) em vez da tabela inteira de todas as propriedades.
David Brown