Есть ли эквивалент «который» в командной строке Windows? - PullRequest
2126 голосов
/ 20 ноября 2008

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

Есть ли эквивалент UNIX-команды 'which'?

В UNIX which command печатает полный путь данной команды, чтобы легко находить и устранять эти проблемы с тенями.

Ответы [ 23 ]

2332 голосов
/ 20 ноября 2008

Windows Server 2003 и более поздние версии (т. Е. Все, что после 32-разрядной Windows XP) предоставляют программу where.exe, которая выполняет некоторые действия which, хотя она соответствует всем типам файлов, а не только исполняемым командам. (Он не соответствует встроенным командам оболочки, таким как cd.) Он даже принимает символы подстановки, поэтому where nt* находит все файлы в вашем %PATH% и текущем каталоге, имена которых начинаются с nt.

Попробуйте where /? за помощью.

Обратите внимание, что Windows PowerShell определяет where как псевдоним для командлета Where-Object , поэтому, если вы хотите where.exe, вам нужно ввести полное имя, а не пропускать расширение .exe .

274 голосов
/ 20 ноября 2008

Хотя в более поздних версиях Windows есть команда where, вы также можете сделать это с Windows XP с помощью модификаторов переменных среды, как показано ниже:

c:\> for %i in (cmd.exe) do @echo.   %~$PATH:i
   C:\WINDOWS\system32\cmd.exe

c:\> for %i in (python.exe) do @echo.   %~$PATH:i
   C:\Python25\python.exe

Вам не нужны никакие дополнительные инструменты, и он не ограничен PATH, поскольку вы можете заменить любую переменную среды (в формате пути, конечно), которую вы хотите использовать.


И, если вам нужно то, которое может обрабатывать все расширения в PATHEXT (как это делает сама Windows), то это поможет:

@echo off
setlocal enableextensions enabledelayedexpansion

:: Needs an argument.

if "x%1"=="x" (
    echo Usage: which ^<progName^>
    goto :end
)

:: First try the unadorned filenmame.

set fullspec=
call :find_it %1

:: Then try all adorned filenames in order.

set mypathext=!pathext!
:loop1
    :: Stop if found or out of extensions.

    if "x!mypathext!"=="x" goto :loop1end

    :: Get the next extension and try it.

    for /f "delims=;" %%j in ("!mypathext!") do set myext=%%j
    call :find_it %1!myext!

:: Remove the extension (not overly efficient but it works).

:loop2
    if not "x!myext!"=="x" (
        set myext=!myext:~1!
        set mypathext=!mypathext:~1!
        goto :loop2
    )
    if not "x!mypathext!"=="x" set mypathext=!mypathext:~1!

    goto :loop1
:loop1end

:end
endlocal
goto :eof

:: Function to find and print a file in the path.

:find_it
    for %%i in (%1) do set fullspec=%%~$PATH:i
    if not "x!fullspec!"=="x" @echo.   !fullspec!
    goto :eof

На самом деле он возвращает все возможности, но вы можете легко настроить его для определенных правил поиска.

130 голосов
/ 26 ноября 2014

В PowerShell Get-Command найдет исполняемые файлы в любом месте $Env:PATH.

Get-Command eventvwr

CommandType   Name          Definition
-----------   ----          ----------
Application   eventvwr.exe  c:\windows\system32\eventvwr.exe
Application   eventvwr.msc  c:\windows\system32\eventvwr.msc

Он также находит командлеты PowerShell, функции, псевдонимы, файлы с пользовательскими расширениями исполняемых файлов с помощью $Env:PATHEXT и т. Д., Определенные для текущей оболочки (довольно похоже на type -a foo Bash) - что делает его более удобным, чем другие инструменты например where.exe, which.exe и т. д., которые не знают об этих командах PowerShell.

Поиск исполняемых файлов, используя только часть имени

gcm *disk*

CommandType     Name                             Version    Source
-----------     ----                             -------    ------
Alias           Disable-PhysicalDiskIndication   2.0.0.0    Storage
Alias           Enable-PhysicalDiskIndication    2.0.0.0    Storage
Function        Add-PhysicalDisk                 2.0.0.0    Storage
Function        Add-VirtualDiskToMaskingSet      2.0.0.0    Storage
Function        Clear-Disk                       2.0.0.0    Storage
Cmdlet          Get-PmemDisk                     1.0.0.0    PersistentMemory
Cmdlet          New-PmemDisk                     1.0.0.0    PersistentMemory
Cmdlet          Remove-PmemDisk                  1.0.0.0    PersistentMemory
Application     diskmgmt.msc                     0.0.0.0    C:\WINDOWS\system32\diskmgmt.msc
Application     diskpart.exe                     10.0.17... C:\WINDOWS\system32\diskpart.exe
Application     diskperf.exe                     10.0.17... C:\WINDOWS\system32\diskperf.exe
Application     diskraid.exe                     10.0.17... C:\WINDOWS\system32\diskraid.exe
...

Поиск пользовательских исполняемых файлов

Чтобы найти другие исполняемые файлы, отличные от Windows (python, ruby, perl и т. Д.), Необходимо добавить расширения файлов для этих исполняемых файлов в переменную среды PATHEXT (по умолчанию .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL), чтобы идентифицировать файлы с этими расширениями в PATH как исполняемый файл. Поскольку Get-Command также учитывает эту переменную, она может быть расширена для отображения пользовательских исполняемых файлов. например,

$Env:PATHEXT="$Env:PATHEXT;.dll;.ps1;.psm1;.py"     # temporary assignment, only for this shell's process

gcm user32,kernel32,*WASM*,*http*py

CommandType     Name                        Version    Source
-----------     ----                        -------    ------
ExternalScript  Invoke-WASMProfiler.ps1                C:\WINDOWS\System32\WindowsPowerShell\v1.0\Invoke-WASMProfiler.ps1
Application     http-server.py              0.0.0.0    C:\Users\ME\AppData\Local\Microsoft\WindowsApps\http-server.py
Application     kernel32.dll                10.0.17... C:\WINDOWS\system32\kernel32.dll
Application     user32.dll                  10.0.17... C:\WINDOWS\system32\user32.dll

Вы можете быстро настроить псевдоним с помощью sal which gcm (краткая форма set-alias which get-command).

Дополнительную информацию и примеры можно найти в онлайн-справке для Get-Command.

53 голосов
/ 01 декабря 2012

В Windows PowerShell:

set-alias which where.exe
38 голосов
/ 20 ноября 2008

Если у вас установлен PowerShell (что я рекомендую), вы можете использовать следующую команду в качестве грубого эквивалента (замените имя_программы именем вашего исполняемого файла):

($Env:Path).Split(";") | Get-ChildItem -filter programName*

Больше здесь: Мой Манвич! PowerShell Which

34 голосов
/ 20 ноября 2008

Инструменты GnuWin32 имеют which вместе с целым рядом других инструментов Unix.

24 голосов
/ 01 апреля 2016

В Windows CMD which звонки where:

$ where php
C:\Program Files\PHP\php.exe
17 голосов
/ 12 октября 2010

Cygwin - это решение. Если вы не возражаете против использования стороннего решения, Cygwin - это то, что вам нужно.

Cygwin предоставляет вам комфорт * nix в среде Windows (и вы можете использовать его в командной оболочке Windows или использовать оболочку * nix по вашему выбору). Он дает вам целый набор * nix команд (например, which) для Windows, и вы можете просто включить этот каталог в ваш PATH.

12 голосов
/ 11 сентября 2015

В PowerShell это gcm, что дает отформатированную информацию о других командах. Если вы хотите получить только путь к исполняемому файлу, используйте .Source.

Например: gcm git или (gcm git).Source

Tidbits:

  • Доступно для Windows XP.
  • Доступно с PowerShell 1.0.
  • gcm - псевдоним Get-Command командлет .
  • Без каких-либо параметров выводится список всех доступных команд, предлагаемых оболочкой хоста.
  • Вы можете создать пользовательский псевдоним с Set-Alias which gcm и использовать его следующим образом: (which git).Source.
  • Официальные документы: https://technet.microsoft.com/en-us/library/ee176842.aspx
10 голосов
/ 31 июля 2015

В моем профиле PowerShell есть функция с именем 'which'

function which {
    get-command $args[0]| format-list
}

Вот как выглядит вывод:

PS C:\Users\fez> which python


Name            : python.exe
CommandType     : Application
Definition      : C:\Python27\python.exe
Extension       : .exe
Path            : C:\Python27\python.exe
FileVersionInfo : File:             C:\Python27\python.exe
                  InternalName:
                  OriginalFilename:
                  FileVersion:
                  FileDescription:
                  Product:
                  ProductVersion:
                  Debug:            False
                  Patched:          False
                  PreRelease:       False
                  PrivateBuild:     False
                  SpecialBuild:     False
                  Language:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...