Как мне найти расположение исполняемого файла в Windows?

154

Я вспомнил, что использовал инструмент под названием as, whereчтобы находить места для любых исполняемых программ, подобных этой, в консоли:

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

Сейчас я не могу найти этот инструмент. Не уверены, есть ли в Windows встроенный инструмент для этого поиска?

David.Chu.ca
источник
Если приложение запущено и вам нужно знать его местоположение, используйте Process Explorer (из Sys Internals).
Ганеш Р.
6
whereработал для меня на Windows 7 Enterprise
Богемский
4
PAGING OP: Пожалуйста, обновите принятый ответ :)
Jake
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
Как насчет powershell. Как я могу добиться того же в PowerShell?
КРВ
1
@krv Как упомянул @DaveAndersen, в powershell вы можете ввести Get-Command ping(или просто gcm ping), который даст вам полный путь, а также некоторую другую информацию.
Сэм
22

РЕДАКТИРОВАТЬ: я должен был добавить, если вы не можете использовать команду WHERE из командной строки, проверьте переменную PATH. (Просто используйте команду «путь».) Убедитесь, что C: \ Windows \ System32 находится в вашем пути. Вот где находится "where.exe".

Где команда, которую вы ищете! WHERE - это нечто среднее между встроенной в UNIX оболочкой «which» и командой «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 Search.
Ганеш Р.
5
Это делает рекурсивный поиск диска и будет длиться вечно.
djhowell
6
Единственный способ найти исполняемые файлы, которые не помещаются в переменную окружения PATH, - это сделать это. Он никогда не указывал свой путь, он сказал какой-нибудь исполняемый файл .
Джон Т
он находит исполняемый файл, но занимает некоторое время.
Майкл 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

Расстраивает, что это не встроенная простая команда.

Однако существует несколько решений, одним из которых является командный файл .

Создайте командный файл (which.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).

harrymc
источник
1
Ночная и дневная разница между этим и поиском окон.
AnthonyVO
1

Если вы просто хотите что , у проекта GnuWin32 есть куча утилит unix с отдельными установщиками.

Только в любви
источник
1

В PowerShell

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

Вы можете легко преобразовать это в командлет.

Другой способ сделать это, как предложено в редактировании:

get-command notepad.exe | select Source
Anupam
источник
0

Если вам просто нужен путь для его запуска, часто лучше использовать команду запуска. Например, вы можете использовать «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, которые необходимы для пользователей, у которых расширения не включены по умолчанию.

bobbogo
источник