Як знайти місце виконання виконуваного файлу в Windows?


154

Я згадав, що я використовував інструмент, який називається whereдля пошуку місць для будь-яких виконуваних програм на зразок цієї консолі:

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

Зараз я не можу знайти цей інструмент. Не знаєте, чи в Windows є вбудований інструмент для цього пошуку?



Якщо програма запущена і вам потрібно знати її місцезнаходження, скористайтеся Провідником процесів (від Sys Internals).
Ганеш Р.

6
whereпрацював для мене на Windows 7 Enterprise
Bohemian

4
PAGING OP: Будь ласка, оновіть прийняту відповідь :)
Джейк,

1
@ David.Chu.ca, будь ласка, оновіть прийняту відповідь
Метт Фарр

Відповіді:


351

Відповідно до відповіді StackOverflow на " Чи існує еквівалент" який "у Windows? , where.exeробить це для Windows 7 та Windows Server 2003 та новіших версій:

Приклад

C:\> where ping

Вихід:

C:\Windows\System32\PING.EXE

19
Це слід сприймати як правильну відповідь, оскільки це працює без встановлення додаткового програмного забезпечення
Cookie

25
Важливою частиною цієї відповіді є те, що в powershell where- це псевдонім за замовчуванням для Where-Object, тому вам потрібно використовувати where.exe, або gcm/Get-Command
Дейв Андерсен

2
А що з панщиною? Як я можу домогтися того ж в оболонці?
кров

1
@krv Як згадував @DaveAndersen, в powershell ви можете ввести Get-Command ping(або просто gcm ping), що дасть вам повний шлях разом з іншою інформацією.
Сем

22

EDIT: Я повинен був би додати, якщо ви не можете використовувати команду WHERE з командного рядка, перевірте свою змінну PATH. (Просто скористайтеся командою "path".) Переконайтеся, що на вашому шляху стоїть C: \ Windows \ System32. Ось тут і знаходиться "where.exe".

ДЕ команда, яку ви шукаєте! WHERE - це як перехрес між вбудованою оболонкою UNIX "that" та командою "locate", оскільки вона працює як для виконуваних команд, так і для звичайних файлів.

Це також дещо складніше, ніж будь-яке з цих двох, хоча, загалом, просте

WHERE <file>

буду працювати.

Він відрізняється від команди "locate" тим, що не переглядає всю файлову систему. Натомість поведінка за замовчуванням полягає у пошуку файлів у двох місцях:

  • Поточний каталог.
  • Усі каталоги в змінній PATH.

Отже, будь-яка команда, яку можна запустити безпосередньо з командного рядка, не вказуючи каталог, знайдеться командою WHERE. (Тому що будь-яка така команда вже є у списку змінних PATH.)

Якщо ви хочете шукати лише в змінній командного шляху, ви можете використовувати:

WHERE "$path:<search text>"

Якщо, з іншого боку, ви хочете знайти всі копії файлу в дереві каталогів, ви можете використовувати:

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

Нарешті, WHERE знайде команди та будь-які файли із розширенням зі змінної PATHEXT без включення розширення. Усі інші файли повинні бути вказані або точно, або з підстановкою.

Візьмемо для прикладу файли "dxdiag.exe" і "dxdiagn.dll". Зверніть увагу на таку команду та її вихід:

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

Йому вдається повернути всі версії "dxdiag.exe", оскільки ".exe" - це одне з розширень змінної PATHEXT. (Примітка: "WHERE dxdiag" також працював би, оскільки C: \ Windows \ System32 знаходиться в змінній PATH.)

WHERE /R C:\Windows dxdiagn

з іншого боку, не повертає жодного результату, оскільки ".dll" відсутній у PATHEXT.

У цьому випадку подивіться на результат, який додає нам підстановку:

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

Він успішно повертає всі версії dxdiagn.dll.

Для отримання додаткової інформації використовуйте "ДЕ /?". Сподіваюся, це допомагає!


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

1
@vp_arth Думав саме те саме :)
Інженер, що

10

використання dir:

cd \
dir /s /b mytool.exe

cd \частина змінює вас в кореневий каталог диска, щоб забезпечити почнеться пошук у верхній частині ієрархії.


Схоже, виконується командний рядок пошуку Windows.
Ганеш Р.

5
Це робить рекурсивний пошук приводу і зайняв би вічно.
djhowell

6
Єдиний спосіб знайти виконавчі файли AREN'T у змінній середовища PATH - це зробити це. Він ніколи не вказував свій шлях, він сказав, що виконується .
Джон Т

він дійсно знаходить виконуваний файл, але потребує певного часу.
Michael Z

це, звичайно, працює лише в тому випадку, якщо ви знаєте ім'я виконавчого файлу або хоча б частину назви
Олівер Вільямс

9

Зауважте, що деякі речі можуть бути трохи різними для 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

Дякую, це працює як для cmd, так і для PowerShell
Ding-Yi Chen

3

Розчарування, що це не вбудована як проста команда.

Однак існує кілька рішень, одне з яких - пакетний файл .

Створіть пакетний файл (what.bat) наступним чином:

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

Це виглядає в локальному каталозі, візьме параметр імені файлу з розширенням або без нього і поверне першу відповідність з поточного каталогу або в PATH.

Потім запустіть його так, which cmd.exeщоб знайти cmd.exe, який буде виконуватися при введенні cmd.


3

У Windows ви можете скористатися безкоштовною утилітою Пошукова система Все, щоб миттєво шукати будь-який файл за повним або частковим іменем (якщо ваш жорсткий диск відформатований у ntfs).


1
Різниця між ніччю та днем ​​між цим та пошуком Windows.
AnthonyVO


1

В PowerShell

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

Ви можете легко перетворити це в Cmdlet.

Ще один спосіб досягти цього, як запропоновано в редакції:

get-command notepad.exe | select Source

0

Якщо вам просто потрібен шлях для його запуску, часто краще скористатися командою start. Наприклад, ви можете використовувати "start chrome.exe" для запуску Chrom {e | ium}, незалежно від того, де він встановлений.


0

Хе, я просто мушу опублікувати пакетний файл одного вкладиша цього 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

Тест:

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

Не зовсім однолінійний, якщо ввести код setlocal enableextensionsі endlocal, який потрібен користувачам, у яких розширення не включені за замовчуванням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.