НейроАгент

Эквивалент команды which в Windows: where и Get-Command

Узнайте эквиваленты команды UNIX 'which' в Windows. Находите пути к исполняемым файлам с помощью 'where' и Get-Command в PowerShell. Решайте проблемы с затенением PATH и находите источники команд.

Существует ли аналог команды UNIX ‘which’ в командной строке Windows?

Иногда я сталкиваюсь с проблемами путей, когда один из моих cmd-скриптов скрыт (затенен) другой программой, которая находится выше в PATH. Мне нужен способ найти полный путь к программе в командной строке Windows, когда известен только ее имя.

Существует ли аналог команды UNIX ‘which’ в Windows?

В UNIX-системах команда which команда выводит полный путь к указанной команде, что упрощает идентификацию и решение таких проблем затенения.

НейроАгент

Командные строки Windows, эквивалентные UNIX ‘which’

В Windows существует несколько командных эквивалентов команды UNIX ‘which’, включая встроенную команду where и PowerShell Get-Command. Эти инструменты помогают найти полный путь к исполняемым файлам и решить проблемы затенения PATH, показывая, какая версия команды будет выполнена на основе порядка каталогов в переменной окружения PATH.

Содержание

Командные эквиваленты 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 - Показывать размеры файлов и даты последнего изменения

Примеры

cmd
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 информацию о командах.

powershell
Get-Command python           # Найти команды Python
Get-Command -Name python     # Явное указание имени параметра
Get-Command -Name ping -All  # Показать все совпадения, а не только первое
Get-Command notepad | Select-Object Name, Source, Definition

Get-Command с дополнительными свойствами

powershell
Get-Command python | Format-List Name, Source, Version, Definition
Get-Command ping | Where-Object { $_.CommandType -eq "Application" }

Псевдонимы PowerShell для быстрого использования

powershell
# Создание псевдонима, аналогичного UNIX which
Set-Alias which Get-Command

# Использование
which python
which -All ping

PowerShell Get-Command более мощный, чем where, так как он может находить не только исполняемые файлы, но и командлеты, функции, псевдонимы и скрипты, а также предоставляет метаданные, такую как информация о версии.


Альтернативные методы

Когда встроенные команды недоступны или требуются другие подходы, несколько альтернатив могут помочь найти пути к исполняемым файлам.

Использование цикла for с переменными окружения

cmd
@echo off
for %%i in (python.exe) do echo %%~$PATH:i

Эта команда расширяется до полного пути python.exe, если найден в PATH, или ничего не показывает, если не найден.

Решения на основе реестра

Windows хранит пути некоторых приложений в реестре, который можно запросить:

cmd
reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\python.exe

Ручной поиск по PATH

Можно вручную искать по каталогам PATH:

cmd
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.

Поиск выполняемой версии команды

cmd
where python

Это показывает все исполняемые файлы Python в порядке PATH, помогая определить, какой из них фактически будет запущен.

Создание карты порядка PATH

cmd
@echo off
echo Текущие каталоги PATH:
for %%d in (%PATH%) do echo   %%d
echo.
echo Где находятся команды:
where ping
where python
where node

Идентификация затененных скриптов

Если ваш собственный скрипт скрыт системными командами, используйте этот подход:

cmd
@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

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’

batch
@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’

powershell
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

powershell
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.

Источники

  1. Документация Microsoft - справка по команде where
  2. Документация PowerShell Get-Command
  3. Переменная окружения PATH командной строки Windows
  4. Stack Overflow - Windows эквивалент команды which
  5. SS64 - команда Windows where