Jak znaleźć lokalizację pliku wykonywalnego w systemie Windows?

154

Przypomniałem sobie, że użyłem narzędzia o nazwie as, whereaby znaleźć lokalizacje dla dowolnych programów wykonywalnych takich jak ten w konsoli:

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

Teraz nie mogę znaleźć tego narzędzia. Nie jesteś pewien, czy system Windows ma wbudowane narzędzie do wyszukiwania?

David.Chu.ca
źródło
1
Różne odpowiedzi na temat Czy istnieje odpowiednik „które” w systemie Windows? - Przepełnienie stosu
Satanicpuppy 30.09.09
JEŚLI aplikacja jest uruchomiona i musisz znać jej lokalizację, użyj Process Explorer (z Sys Internals).
Ganesh R.
6
wherepracował dla mnie na Windows 7 Enterprise
Bohemian
4
OPROGRAMOWANIE: Zaktualizuj zaakceptowaną odpowiedź :)
Jake,
1
@ David.Chu.ca zaktualizuj zaakceptowaną odpowiedź
Matt Frear,

Odpowiedzi:

351

Zgodnie z odpowiedzią StackOverflow na stronie Czy istnieje odpowiednik „które” w systemie Windows? , where.exerobi to w systemie Windows 7 i Windows Server 2003 i nowszych wersjach:

Przykład

C:\> where ping

Wynik:

C:\Windows\System32\PING.EXE
Simon D.
źródło
19
To powinno być uznane za poprawną odpowiedź, ponieważ działa bez instalowania dodatkowego oprogramowania
Cookie
25
Ważną częścią tej odpowiedzi jest to, że w PowerShell wherejest domyślnym aliasem dla Where-Object, więc zamiast tego musisz użyć where.exelub gcm/Get-Command
Dave Andersen
2
Co z PowerShell. Jak mogę osiągnąć to samo w PowerShell?
krv
1
@krv Jak wspomniano w @DaveAndersen, w PowerShellie możesz wpisać Get-Command ping(lub po prostu gcm ping), co da ci pełną ścieżkę wraz z kilkoma innymi informacjami.
Sam
22

EDYCJA: Powinienem był dodać, jeśli nie możesz użyć polecenia GDZIE z wiersza polecenia, sprawdź swoją zmienną PATH. (Wystarczy użyć polecenia „path”). Upewnij się, że C: \ Windows \ System32 znajduje się na twojej ścieżce. Tam właśnie znajduje się „where.exe”.

GDZIE jest polecenie, którego szukasz! GDZIE jest jak skrzyżowanie wbudowanej powłoki „UNIX” powłoki „UNIX” z poleceniem „locate”, ponieważ działa zarówno dla plików wykonywalnych poleceń, jak i zwykłych plików.

Jest również nieco bardziej skomplikowany niż którykolwiek z tych dwóch, choć generalnie prosty

WHERE <file>

będzie działać.

Różni się od polecenia „locate” tym, że nie przegląda całego systemu plików. Zamiast tego domyślnym zachowaniem jest wyszukiwanie plików w dwóch lokalizacjach:

  • Bieżący katalog.
  • Wszystkie katalogi w zmiennej PATH.

Tak więc każde polecenie, które można uruchomić bezpośrednio z wiersza polecenia bez określania katalogu, zostanie znalezione przez polecenie WHERE. (Ponieważ każde takie polecenie jest już na liście zmiennych PATH).

Jeśli chcesz wyszukiwać tylko w zmiennej ścieżki poleceń, możesz użyć:

WHERE "$path:<search text>"

Jeśli z drugiej strony chcesz znaleźć wszystkie kopie pliku w drzewie katalogów, możesz użyć:

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

Wreszcie WHERE znajdzie polecenia i wszelkie pliki z rozszerzeniem ze zmiennej PATHEXT bez uwzględnienia rozszerzenia. Wszystkie pozostałe pliki muszą być określone dokładnie lub za pomocą symboli wieloznacznych.

Weźmy na przykład pliki „dxdiag.exe” i „dxdiagn.dll”. Zwróć uwagę na następujące polecenie i jego dane wyjściowe:

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

Udało mu się zwrócić wszystkie wersje „dxdiag.exe”, ponieważ „.exe” jest jednym z rozszerzeń zmiennej PATHEXT. (Uwaga: „GDZIE dxdiag” również działałoby, ponieważ C: \ Windows \ System32 znajduje się w zmiennej PATH.)

WHERE /R C:\Windows dxdiagn

z drugiej strony nie zwraca żadnego wyniku, ponieważ „.dll” nie znajduje się w PATHEXT.

W takim przypadku spójrz na wynik dodania symbolu wieloznacznego:

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

Z powodzeniem zwraca wszystkie wersje dxdiagn.dll.

Aby uzyskać więcej informacji, użyj „GDZIE /?”. Mam nadzieję że to pomoże!

geo
źródło
2
where where C:\Windows\System32\where.exe:)
vp_arth
1
@vp_arth Właśnie myślałem dokładnie to samo :)
Reversed Engineer
10

użyj dir:

cd \
dir /s /b mytool.exe

cd \część zmienia cię do katalogu głównego dysku, aby upewnić się rozpocznie wyszukiwanie na szczycie hierarchii.

John T.
źródło
Wygląda na to, że robi się Windows Search z linii poleceń.
Ganesh R.
5
Spowoduje to rekurencyjne przeszukiwanie dysku i zajmie to wieczność.
djhowell
6
Jedynym sposobem na znalezienie plików wykonywalnych, które NIE JEST W zmiennej środowiskowej PATH, jest zrobienie tego. Nigdy nie określał swojej ścieżki, powiedział, że jest wykonywalny .
John T
znajduje plik wykonywalny, ale zajmuje trochę czasu.
Michael Z
działa to oczywiście tylko wtedy, gdy znasz nazwę pliku wykonywalnego lub przynajmniej część nazwy
Oliver Williams,
9

Zauważ, że niektóre rzeczy mogą się nieco różnić w 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
źródło
Dzięki, działa to zarówno dla cmd, jak i PowerShell
Ding-Yi Chen
3

Frustrujące, że nie jest wbudowane jako proste polecenie.

Istnieje jednak kilka rozwiązań, z których jedno jest plikiem wsadowym .

Utwórz plik wsadowy (which.bat) w następujący sposób:

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

Przeszukuje katalog lokalny, pobiera parametr nazwy pliku z rozszerzeniem lub bez niego i zwraca pierwsze dopasowanie z bieżącego katalogu lub w ścieżce PATH.

Następnie uruchom go tak, which cmd.exeaby znaleźć cmd.exe, który uruchomi się po wpisaniu cmd.

bw
źródło
3

W systemie Windows można użyć bezpłatnej wyszukiwarki Everything, aby natychmiast wyszukać dowolny plik według pełnej lub częściowej nazwy (jeśli dysk twardy jest sformatowany w NTFS).

harrymc
źródło
1
Różnica między nocą a dniem między wyszukiwaniem w systemie Windows.
AnthonyVO
1

W PowerShell

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

Możesz łatwo przekonwertować to na polecenie cmdlet.

Inny sposób osiągnięcia tego, jak sugerowano w edycji:

get-command notepad.exe | select Source
Anupam
źródło
0

Jeśli potrzebujesz tylko ścieżki do jej uruchomienia, często lepiej jest użyć polecenia start. Na przykład możesz użyć polecenia „start chrome.exe”, aby uruchomić Chrom {e | ium}, niezależnie od tego, gdzie jest zainstalowany.

Anonimowy Tchórz
źródło
0

Heh, muszę tylko opublikować jeden plik wsadowy tego systemu 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

Badanie:

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

Niezupełnie jednowierszowy, jeśli zawijasz kod setlocal enableextensionsi endlocal, które są wymagane dla użytkowników, którzy nie mają domyślnie włączonych rozszerzeń.

bobbogo
źródło