Существует ли аналог команды UNIX ‘which’ в командной строке Windows?
Иногда я сталкиваюсь с проблемами путей, когда один из моих cmd-скриптов скрыт (затенен) другой программой, которая находится выше в PATH. Мне нужен способ найти полный путь к программе в командной строке Windows, когда известен только ее имя.
Существует ли аналог команды UNIX ‘which’ в Windows?
В UNIX-системах команда which команда выводит полный путь к указанной команде, что упрощает идентификацию и решение таких проблем затенения.
Командные строки Windows, эквивалентные UNIX ‘which’
В Windows существует несколько командных эквивалентов команды UNIX ‘which’, включая встроенную команду where и PowerShell Get-Command. Эти инструменты помогают найти полный путь к исполняемым файлам и решить проблемы затенения PATH, показывая, какая версия команды будет выполнена на основе порядка каталогов в переменной окружения PATH.
Содержание
- Командные эквиваленты Windows
- Использование команды
where - Решения PowerShell
- Альтернативные методы
- Практические примеры для отладки PATH
- Создание собственного эквивалента ‘which’
Командные эквиваленты Windows
Windows предлагает несколько способов поиска путей к исполняемым файлам, каждый из которых имеет разные возможности и варианты использования. Наиболее прямыми эквивалентами UNIX which являются:
Команда where - самый близкий родной эквивалент Windows, который ищет в каталогах PATH и показывает все совпадения в порядке приоритета выполнения.
PowerShell Get-Command - более мощный и информативный, предоставляя подробные сведения о командах, включая их источник, версию и путь.
whereis - хотя это не встроенная команда Windows, некоторые сторонние инструменты или UNIX-подобные среды (например, Git Bash или WSL) могут предоставлять эту функциональность.
Основное отличие между этими инструментами заключается в том, что where показывает, что Windows фактически выполнит на основе порядка PATH, в то время как PowerShell Get-Command предоставляет более comprehensive информацию о доступных командах.
Использование команды where
Команда where - это встроенное решение Windows для поиска путей к исполняемым файлам и самый прямой эквивалент UNIX which. Она ищет в каталогах, указанных в переменной окружения PATH, и отображает все совпадения.
Базовый синтаксис
where [параметры] <имя_команды>
Общие параметры
/R <каталог>- Рекурсивный поиск в указанном каталоге/F- Принудительное точное соответствие (без расширения шаблонов)/T- Показывать размеры файлов и даты последнего изменения
Примеры
where python # Найти все исполняемые файлы Python в PATH
where /R C:\ python # Рекурсивный поиск python.exe в C:\
where notepad # Найти расположение notepad.exe
where ping # Показать, какая команда ping будет использована
Команда where будет отображать результаты в порядке, в котором они были бы выполнены системой, при первом совпадении будет тот, который запустился бы при простом вводе имени команды.
Решения PowerShell
PowerShell предоставляет еще более мощные альтернативы для поиска путей к исполняемым файлам с дополнительными метаданными и возможностями фильтрации.
Get-Command
Основной эквивалент PowerShell для which - это Get-Command, который предоставляет comprehensive информацию о командах.
Get-Command python # Найти команды Python
Get-Command -Name python # Явное указание имени параметра
Get-Command -Name ping -All # Показать все совпадения, а не только первое
Get-Command notepad | Select-Object Name, Source, Definition
Get-Command с дополнительными свойствами
Get-Command python | Format-List Name, Source, Version, Definition
Get-Command ping | Where-Object { $_.CommandType -eq "Application" }
Псевдонимы PowerShell для быстрого использования
# Создание псевдонима, аналогичного UNIX which
Set-Alias which Get-Command
# Использование
which python
which -All ping
PowerShell Get-Command более мощный, чем where, так как он может находить не только исполняемые файлы, но и командлеты, функции, псевдонимы и скрипты, а также предоставляет метаданные, такую как информация о версии.
Альтернативные методы
Когда встроенные команды недоступны или требуются другие подходы, несколько альтернатив могут помочь найти пути к исполняемым файлам.
Использование цикла for с переменными окружения
@echo off
for %%i in (python.exe) do echo %%~$PATH:i
Эта команда расширяется до полного пути python.exe, если найден в PATH, или ничего не показывает, если не найден.
Решения на основе реестра
Windows хранит пути некоторых приложений в реестре, который можно запросить:
reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\python.exe
Ручной поиск по PATH
Можно вручную искать по каталогам PATH:
for %%d in (%PATH%) do if exist "%%d\python.exe" echo Found: %%d\python.exe
Сторонние инструменты
- GnuWin32 Coreutils - Предоставляет UNIX-подобные инструменты, включая
which - Git Bash - Включает команду
whichиз набора UNIX-инструментов - WSL (Windows Subsystem for Linux) - Полная UNIX-среда с родным
which
Практические примеры для отладки PATH
Вот практические решения для конкретной проблемы идентификации затененных команд и понимания разрешения PATH.
Поиск выполняемой версии команды
where python
Это показывает все исполняемые файлы Python в порядке PATH, помогая определить, какой из них фактически будет запущен.
Создание карты порядка PATH
@echo off
echo Текущие каталоги PATH:
for %%d in (%PATH%) do echo %%d
echo.
echo Где находятся команды:
where ping
where python
where node
Идентификация затененных скриптов
Если ваш собственный скрипт скрыт системными командами, используйте этот подход:
@echo off
setlocal enabledelayedexpansion
# Поиск конкретной команды
set command=myscript
echo Поиск %command%...
# Проверка каждого каталога PATH
for %%d in (%PATH%) do (
if exist "%%d\%command%.bat" (
echo Найдено: %%d\%command%.bat
echo Это будет выполнено вместо вашего скрипта
)
)
# Показать, что Windows фактически выполнит
where %command%
Анализ PATH в PowerShell
# Получить PATH как массив
$paths = $env:PATH -split ';'
# Найти все экземпляры команды
$command = "python"
$results = @()
foreach ($path in $paths) {
$fullPath = Join-Path $path "$command.exe"
if (Test-Path $fullPath) {
$results += [PSCustomObject]@{
Path = $path
FullPath = $fullPath
Size = (Get-Item $fullPath).Length
Modified = (Get-Item $fullPath).LastWriteTime
}
}
}
# Отобразить результаты
$results | Format-Table -AutoSize
Write-Host "Команда '$command' будет выполнена:" $results[0].FullPath
Создание собственного эквивалента ‘which’
Для более специализированных решений можно создавать пакетные скрипты или функции PowerShell, которые предоставляют именно функциональность, которая вам нужна.
Пакетный скрипт ‘which.bat’
@echo off
if "%~1"=="" (
echo Использование: which ^<команда^>
echo Находит полный путь к команде в PATH
exit /b 1
)
setlocal
set command=%~1
# Проверить, существует ли команда в PATH
for %%i in ("%command%") do set fullpath=%%~$PATH:i
if defined fullpath (
echo %fullpath%
) else (
echo Команда '%command%' не найдена в PATH
exit /b 1
)
Функция PowerShell ‘Which-Command’
function Which-Command {
param(
[Parameter(Mandatory=$true)]
[string]$Name,
[switch]$All
)
if ($All) {
Get-Command -Name $Name -All | Select-Object Name, Source, Definition
} else {
$result = Get-Command -Name $Name -ErrorAction SilentlyContinue
if ($result) {
$result.Definition
} else {
Write-Warning "Команда '$Name' не найдена"
}
}
}
# Установить псевдоним для удобного использования
Set-Alias which Which-Command
Расширенная версия с информацией о PATH
function Show-CommandPath {
param(
[Parameter(Mandatory=$true)]
[string[]]$Commands
)
$paths = $env:PATH -split ';'
foreach ($cmd in $Commands) {
Write-Host "`nКоманда: $cmd" -ForegroundColor Cyan
Write-Host "========================"
$found = $false
foreach ($path in $paths) {
$fullPath = Join-Path $path "$cmd.exe"
if (Test-Path $fullPath) {
$found = $true
$item = Get-Item $fullPath
Write-Host "Найдено в: $path" -ForegroundColor Green
Write-Host " Полный путь: $($item.FullName)"
Write-Host " Размер: $([math]::Round($item.Length / 1KB, 2)) КБ"
Write-Host " Изменено: $($item.LastWriteTime)"
}
}
if (-not $found) {
Write-Host "Команда '$cmd' не найдена в PATH" -ForegroundColor Red
}
}
}
Заключение
Windows предоставляет несколько эффективных альтернатив UNIX-команде ‘which’, при этом команда where является наиболее прямым эквивалентом, а PowerShell Get-Command предлагает наиболее comprehensive функциональность. Для решения проблем затенения PATH эти инструменты позволяют точно увидеть, какая версия команды будет выполнена, и понять порядок каталогов в вашей переменной окружения PATH.
Основные рекомендации:
- Используйте
where командадля быстрых, родных решений Windows - Используйте PowerShell
Get-Commandдля получения подробной информации о командах и метаданных - Создавайте пользовательские скрипты для повторяющихся задач анализа PATH
- Рассмотрите сторонние UNIX-подобные инструменты, если вы часто работаете в разных средах
Эти инструменты помогут вам диагностировать и решать проблемы затенения, с которыми вы сталкиваетесь с вашими cmd-скриптами, которые скрываются другими программами в вашем PATH.