Нахождение пути к программе, которая будет выполняться из командной строки в Windows

128

Скажем, у меня есть программа, X.EXEустановленная в папке c:\abcd\happy\в системе. Папка находится по системному пути. Теперь предположим, что в системе есть другая программа, которая также называется X.EXE, но установлена ​​в папке c:\windows\.

Можно ли быстро узнать из командной строки, что если я введу, X.EXEкакой из двух X.EXEбудет запущен? (но без необходимости поиска по каталогу или просмотра деталей процесса в диспетчере задач).

Может быть, какая-то встроенная команда или какая-то программа может делать что-то подобное? :

detect_program_path X.EXE
Zabba
источник

Ответы:

239

Используйте whereкоманду. Первый результат в списке будет выполнен.

C: \> где блокнот
C: \ Windows \ System32 \ notepad.exe
C: \ Windows \ notepad.exe

Согласно этому сообщению в блоге , он where.exeвходит в состав Windows Server 2003 и более поздних версий, поэтому он должен работать только с Vista, Win 7 и др.

В Linux эквивалентом является whichкоманда, например which ssh.

Крис Шмих
источник
2
+1! Я никогда не знал, что это могло быть частью Windows, и поэтому не смотрел в этом направлении! :)
Забба
1
Любой эквивалент для бедных пользователей XP?
shahar_m
@shahar_m: вы пробовали приведенный ниже сценарий от Майкла Берра? Он не встроен, но может делать то, что вам нужно.
Крис Шмих
1
@Kenny: Предполагая, что вы знаете имя DLL, вы можете использовать утилиту ListDLLs ( technet.microsoft.com/en-us/sysinternals/bb896656 ). Из командной строки просто запустите, listdlls -d foo.dllчтобы увидеть все процессы, в которых загружен модуль, и полный путь к загруженному модулю. Кроме того, вы можете просто выполнить поиск файла в Windows по имени файла.
Крис Шмих
2
@Kenny: То, что вы просите, сильно отличается от ответа, размещенного здесь. Вам следует создать новый вопрос о переполнении стека с описанием проведенного вами исследования и разместить ссылку на него в этих комментариях.
Крис Шмих
10

Вот небольшой сценарий cmd, который вы можете скопировать и вставить в файл с именем примерно так 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
Майкл Берр
источник
8

Как ветка, упомянутая в комментарии, get-commandв PowerShell также может решить эту проблему. Например, вы можете ввести, get-command npmи результат будет следующим:

введите описание изображения здесь

Евгений
источник
(get-command npm).Sourceответит только путем к npm (для примера) вместо всей таблицы всех свойств.
Дэвид Браун