Come trovo la posizione di un eseguibile in Windows?


154

Mi sono ricordato che ho usato uno strumento chiamato come whereper trovare posizioni per tutti i programmi eseguibili come questo in una console:

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

Ora non riesco a trovare questo strumento. Non sei sicuro che Windows abbia uno strumento integrato per fare quella ricerca?



SE l'applicazione è in esecuzione e devi conoscere la sua posizione, usa Process Explorer (da Sys Internals).
Ganesh R.

6
whereha funzionato per me su Windows 7 Enterprise
Bohemian

4
PAGING OP: Aggiorna la risposta accettata :)
Jake,

1
@ David.Chu.ca, aggiorna la risposta accettata
Matt Frear,

Risposte:


351

Secondo la risposta StackOverflow a Esiste un equivalente di "quale" su Windows? , where.exefa questo su Windows 7 e Windows Server 2003 e versioni successive:

Esempio

C:\> where ping

Produzione:

C:\Windows\System32\PING.EXE

19
Questo dovrebbe essere reso come la risposta corretta in quanto funziona senza installare software aggiuntivo
Cookie

25
Una parte importante di questa risposta è che in PowerShell, whereè un alias predefinito per Where-Object, quindi è invece necessario utilizzare where.exe, o gcm/Get-Command
Dave Andersen il

2
Che dire di PowerShell. Come posso ottenere lo stesso in PowerShell?
Krv,

1
@krv Come menzionato @DaveAndersen, in PowerShell puoi digitare Get-Command ping(o semplicemente gcm ping), che ti darà il percorso completo, insieme ad alcune altre informazioni.
Sam

22

EDIT: avrei dovuto aggiungere, se non è possibile utilizzare il comando WHERE dal prompt dei comandi, controllare la variabile PATH. (Basta usare il comando "path".) Assicurati che C: \ Windows \ System32 sia nel tuo percorso. Ecco dove si trova "where.exe".

DOVE è il comando che stai cercando! DOVE è come un incrocio tra la shell UNIX incorporata "che" e il comando "individuare", in quanto funziona sia per gli eseguibili dei comandi che per i file regolari.

È anche un po 'più complesso di uno di quei due, anche se, in generale, un semplice

WHERE <file>

funzionerà.

È diverso dal comando "individuare" in quanto non sta esaminando l'intero file system. Al contrario, il comportamento predefinito è cercare i file in due posizioni:

  • La directory corrente.
  • Tutte le directory nella variabile PATH.

Pertanto, qualsiasi comando che è possibile eseguire direttamente da un prompt dei comandi senza specificare la directory, verrà trovato dal comando WHERE. (Perché qualsiasi comando simile è già nell'elenco delle variabili PATH.)

Se si desidera cercare solo nella variabile del percorso di comando, è possibile utilizzare:

WHERE "$path:<search text>"

Se, d'altra parte, si desidera trovare tutte le copie di un file in un albero di directory, è possibile utilizzare:

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

Infine, WHERE troverà i comandi e tutti i file con un'estensione dalla variabile PATHEXT senza includere l'estensione. Tutti gli altri file devono essere specificati esattamente o con caratteri jolly.

Prendiamo ad esempio i file "dxdiag.exe" e "dxdiagn.dll". Nota il seguente comando e il suo output:

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

Riesce a restituire tutte le versioni di "dxdiag.exe" perché ".exe" è una delle estensioni nella variabile PATHEXT. (Nota: "WHERE dxdiag" avrebbe funzionato anche perché C: \ Windows \ System32 si trova nella variabile PATH.)

WHERE /R C:\Windows dxdiagn

d'altra parte, non restituisce alcun risultato, perché ".dll" non è in PATHEXT.

In questo caso, guarda il risultato che l'aggiunta di un carattere jolly ci 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

Restituisce correttamente tutte le versioni di dxdiagn.dll.

Per ulteriori informazioni, utilizzare "WHERE /?". Spero che sia di aiuto!


2
where where C:\Windows\System32\where.exe:)
vp_arth,

1
@vp_arth Stava pensando esattamente la stessa cosa :)
Reversed Engineer

10

usare dir:

cd \
dir /s /b mytool.exe

la cd \parte passa alla radice dell'unità, per garantire che la ricerca inizi nella parte superiore della gerarchia.


Sembra fare una riga di comando di ricerca di Windows.
Ganesh R.

5
Questo fa una ricerca ricorsiva del disco e richiederebbe per sempre.
djhowell,

6
L'unico modo per trovare gli eseguibili che NON SONO nella variabile d'ambiente PATH è farlo. Non ha mai specificato il suo percorso, ha detto qualsiasi eseguibile .
John T,

trova l'eseguibile ma richiede un po 'di tempo.
Michael Z,

questo ovviamente funziona solo se conosci il nome dell'eseguibile o almeno una parte del nome
Oliver Williams,

9

Nota che alcune cose potrebbero essere leggermente diverse per 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

Grazie, questo funziona sia per cmd che per PowerShell
Ding-Yi Chen il

3

Frustrante che non sia integrato come un semplice comando.

Tuttavia, esistono diverse soluzioni, una delle quali è un file batch .

Creare un file batch (which.bat) come segue:

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

Questo appare nella directory locale, prenderà un parametro nome file con o senza estensione e restituirà la prima corrispondenza dalla directory corrente o nel PERCORSO.

Quindi eseguirlo come which cmd.exeper trovare il cmd.exe che verrà eseguito se si digita cmd.


3

Su Windows è possibile utilizzare l'utilità gratuita Tutto il motore di ricerca per cercare istantaneamente qualsiasi file con nome completo o parziale (se il disco rigido è formattato in NTFS).


1
Differenza diurna e notturna tra questa e la ricerca di windows.
AnthonyVO,


1

In PowerShell

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

Puoi facilmente convertirlo in un Cmdlet.

Un altro modo per ottenere questo risultato, come suggerito in una modifica:

get-command notepad.exe | select Source

0

Se hai solo bisogno del percorso per avviarlo, spesso è meglio usare il comando start. Ad esempio, puoi utilizzare "start chrome.exe" per avviare Chrom {e | ium}, indipendentemente da dove è installato.


0

Eh, devo solo pubblicare questo file batch di una sola riga di 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

Un test:

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

Non del tutto semplice se inserisci il codice setlocal enableextensionse endlocal, che sono necessari per gli utenti che non hanno le estensioni abilitate per impostazione predefinita.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.