Вопрос, на который отвечает команда
У вас установлено две версии одной программы, и непонятно, какая из них запускается по имени в консоли. Или команда «не найдена», хотя вы уверены, что программа стоит на компьютере. В обоих случаях помогает where: она ищет файл так же, как это делает командная строка, и выводит полные пути.
Проверка проста: введите where python или where ping. Если файлов несколько, выводится по строке на каждый, и порядок строк отражает порядок поиска. Первая строка соответствует тому, что запустится при вводе имени без полного пути.
Команда входит в Windows и не требует установки. Права администратора не нужны, потому что она только читает пути и ничего не меняет.
Бывает и обратная ситуация: после установки новой версии в консоли всё ещё запускается старая. Where показывает оба файла, и сразу видно, что старый каталог стоит в PATH раньше нового. Исправлять это нужно порядком записей в переменной, а не повторной установкой.
Как Windows ищет исполняемые файлы
Когда вы вводите имя без пути, командная строка сначала смотрит в текущую папку, а затем по очереди перебирает каталоги из переменной окружения PATH. Каталоги разделяются точкой с запятой. Побеждает первое совпадение, поэтому порядок записей в PATH влияет на то, какая версия программы откроется.
Where повторяет эту логику. Поэтому она хорошо показывает случаи, когда в системе есть две копии, например установленная пользователем и поставляемая вместе с другим пакетом. Если первой в списке оказалась не та, поменяйте порядок каталогов в PATH или запускайте программу по полному пути.
Подробно о том, что такое PATH и почему система говорит, что команда не найдена, рассказано на отдельной странице раздела систем. Здесь важно лишь то, что where показывает результат поиска, не вникая в причины.
Расширения, которые командная строка подставляет к имени без суффикса, перечислены в переменной PATHEXT. Поэтому ввод имени без .exe, .cmd или .bat работает. Если два файла с одним именем и разными расширениями лежат в одной папке, запустится тот, чьё расширение стоит в PATHEXT раньше.
Ключи и шаблоны
Имя можно задавать с подстановочными знаками: звёздочка заменяет любое число символов, вопросительный знак один символ. Например, where *.exe покажет исполняемые файлы в текущей папке и каталогах из PATH.
| Запись | Что делает |
|---|---|
| where имя | ищет в текущей папке и по PATH |
| where /R C:\Tools имя | ищет рекурсивно, начиная с указанной папки |
| where /Q имя | не печатает результат, только возвращает код завершения |
| where /F имя | выводит пути в двойных кавычках |
| where /T имя | добавляет размер файла и время изменения |
Код завершения у where простой: 0 означает, что файл найден, 1 что не найден, 2 что произошла ошибка. Ключ /Q с проверкой кода пригоден для скриптов, которым нужно узнать, установлена ли программа, не засоряя вывод.
Для просмотра самого PATH в cmd достаточно ввести echo %PATH%, а в PowerShell выражение $env:Path. Если длинная строка нечитаема, замените в ней точки с запятой на переводы строк средствами текстового редактора: так проще заметить дубликаты и каталоги, которых уже не существует.
Если нужно посмотреть только размер и дату изменения найденного файла, ключ /T избавляет от необходимости открывать проводник. По этим сведениям легко отличить свежую версию программы от старой копии, которая осталась в одном из каталогов PATH после обновления.
where в PowerShell: почему команда ведёт себя странно
В PowerShell слово where является псевдонимом командлета Where-Object, который фильтрует объекты в конвейере. Поэтому запись where python без дополнительных аргументов там не даст ожидаемого результата, а может вывести непонятное сообщение или ничего.
Чтобы вызвать именно программу, пишите where.exe python: с расширением. Так PowerShell запускает внешний файл, а не псевдоним. Результат будет таким же, как в классической командной строке.
- Командная строка (cmd): where имя;
- PowerShell: where.exe имя;
- Get-Command имя в PowerShell покажет и командлеты, и программы, и псевдонимы, что полезно, если неясно, чем именно является имя.
Если нужны сведения о том, откуда запущен уже работающий процесс, используйте не where, а список процессов с путём к файлу.
Дополнительную пользу даёт Get-Command: в отличие от where.exe, он показывает тип найденного объекта (приложение, командлет, функция, псевдоним) и, для приложений, путь к файлу. Если нужно понять, чем является имя в PowerShell, начинайте с него.
Типичные сценарии и ограничения
Проверка установки: where git, where curl, where node. Если команда вернула путь, программа доступна из консоли. Если пишет, что не удалось найти файлы по заданным шаблонам, значит, в текущей папке и в PATH такого файла нет, хотя он мог быть установлен в каталог, не включённый в PATH.
Поиск по диску: where /R C:\ имя.ext ищет файл по всему диску, но на больших дисках это занимает заметное время и может натолкнуться на папки без прав доступа. Для обычного поиска файлов удобнее встроенный поиск проводника.
Where не знает о псевдонимах и функциях оболочки, а ищет только файлы. Поэтому если имя в консоли работает, а where его не находит, возможно, это внутренняя команда cmd (как dir или copy) или псевдоним PowerShell, а не отдельная программа.
Для сценариев удобно сочетание: where /Q имя && echo найдено || echo нет. Оно использует код завершения, о котором говорилось выше, и не требует разбирать текст вывода, а значит работает одинаково в разных языковых версиях Windows.
Результат команды полезно приложить к обращению в поддержку программы: по нему специалисту видно, какие копии установлены и откуда они запускаются.