Есть ли эквивалент «which» в командной строке Windows?

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

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

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


person namin    schedule 20.11.2008    source источник
comment
Что делает то, что делает в Unix?   -  person Foredecker    schedule 20.11.2008
comment
Foredecker: который ищет в PATH исполняемый файл, который будет запущен, если вы введете команду в приглашении оболочки.   -  person Greg Hewgill    schedule 20.11.2008
comment
например, если у вас установлено 5 версий Java, и вы не знаете, какая из них используется, вы можете ввести, какая java, и она даст вам ПУТЬ к двоичному файлу   -  person ninesided    schedule 20.11.2008
comment
@Foredecker, MR говорит, что это где в Win2k3, но Win2k3 не входил в вопрос. Если в других версиях Windows нет, другие ответы также действительны. IMNSHO, лучший ответ, который работает во всех версиях Windows. Кроме того, другие ответы не ошибочны, просто разные способы сделать это.   -  person paxdiablo    schedule 22.11.2008
comment
Я знаю, что этот вопрос возник перед SuperUser, но он, вероятно, принадлежит ему.   -  person palswim    schedule 12.10.2010
comment
Отсюда вы можете получить командный файл размером всего 90 байт: blogs.msdn.com/b/oldnewthing/archive/2005/01/20/357225.aspx Или запустите программу C # - ссылка размещена на веб-сайте выше.   -  person Lukasz Czerwinski    schedule 28.12.2010
comment
Я нашел этот командный файл очень удобным pankaj-k.net/weblog/2004/11 /equivalent_of_which_in_windows.html   -  person Etienne    schedule 22.09.2011
comment
Этот вопрос был задан в других потоках: [Эквивалент команды * Nix 'which' в Powershell?] [1] [Powershell, эквивалент команды unix which?] [2] [1]: stackoverflow.com/questions/63805/ [2]: superuser.com/questions/34492/   -  person Anonymous    schedule 13.12.2011
comment
В стандартном Unix нет команды which. Утилита POSIX - type. В оболочке C есть команда which, а в некоторых системах она используется как внешний исполняемый файл. Например, в Debian Linux which происходит из пакета с именем debutils. Этот внешний which не видит встроенных команд оболочки, псевдонимов или функций. type делает; В type Bash есть возможность подавить это и просто выполнить поиск пути.   -  person Kaz    schedule 17.04.2015
comment
Чтобы проиллюстрировать точку зрения @kaz, сравните результаты which -a pwd с type -a pwd   -  person MarcH    schedule 16.10.2019


Ответы (26)


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

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

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

person Michael Ratanapintha    schedule 20.11.2008
comment
Нет, потому что grep проверяет содержимое своего ввода, которое вы должны указать явно. which и where.exe просматривают только имена файлов в наборе каталогов, заданных в переменных среды PATH. - person Michael Ratanapintha; 11.12.2011
comment
@ Ajedi32 - Верно, которого нет в XP. Как я уже сказал, Windows Server 2003 и новее. - person Michael Ratanapintha; 25.09.2012
comment
@MichaelRatanapintha Да, почему-то я подумал, что Windows Server 2003 была создана до Windows XP. Чувак, XP старый ... - person Ajedi32; 25.09.2012
comment
следите за тем, чтобы этот не работал в PowerShell, если вы не наберете where.exe - person JonnyRaa; 28.01.2014
comment
Предупреждение: where не будет работать с цитируемыми путями, убедитесь, что ваш% path% не содержит их. - person Drealmer; 27.07.2014
comment
Помните, что where.exe не является встроенной оболочкой, вам необходимо иметь %windir%\system32 на вашем %PATH% - что может быть не так, поскольку использование where предполагает, что вы можете работать над проблемами с вашим путем! - person Tomasz Gandor; 08.07.2015
comment
Не работал в CMD на сервере 2016 без ввода where.exe - person Edward; 08.01.2017
comment
Powershell Get-Command или gcm, как указано в другом ответе, эквивалентно where - person tkokasih; 06.09.2017
comment
Также работает в Windows 10. - person Emil Stenström; 08.02.2018
comment
Чтобы быть явным: where.exe может возвращать несколько значений, и в этом случае будет вызвано первое / самое верхнее из них. C:\Windows\System32> where.exe sqlcmd.exe c:\Program Files\Microsoft SQL Server\90\Tools\Binn\SQLCMD.EXE C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\SQLCMD.EXE - person phantom-99w; 13.11.2018
comment
Действительно ли where вне выражения select? В противном случае я бы счел это ошибкой, поскольку из контекста должно быть очевидно, что where.exe предназначается, когда это первое, что вводится в командной строке. - person Chiramisu; 12.05.2020
comment
Сделал шаг вперед и сделал функцию поиска по пути и программным файлам / окнам и т. Д. Можно легко использовать адаптер дальше. См. stackoverflow.com/a/63257980/5079799 - person FreeSoftwareServers; 05.08.2020
comment
re: where.exe may return multiple values Но НЕ обязательно в порядке каталогов в вашей переменной среды echo %PATH%. В Windows есть как переменная уровня пользователя PATH, так и переменная уровня системы PATH. echo %PATH% отображает системную переменную, но which.exe сначала использует переменную уровня пользователя. Сюрприз! - person Jesse Chisholm; 10.12.2020

Хотя в более поздних версиях 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

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

person paxdiablo    schedule 20.11.2008
comment
Привет, если бы я узнал это! Жаль, что это не работает с MS-DOS или Win9x (то есть с command.com). (У Раймонда Чена есть более сложная версия, которую можно превратить в пакетный файл: blogs.msdn.com/oldnewthing/archive/2005/01/20/357225.aspx) - person Michael Ratanapintha; 01.01.2009
comment
@Michael, если вы все еще используете DOS или Win95, поиск исполняемых файлов на пути - это наименьшая из ваших проблем :-) - person paxdiablo; 09.04.2009
comment
Windows распознает больше, чем .exe, как исполняемый файл. В прошлый раз, когда я кодировал which еще в дни W95 / DOS, порядок поиска был - текущий каталог, затем каждый каталог пути, для cmd.com, затем cmd.exe, затем cmd.bat Итак, даже cmd.bat в текущем каталоге выполняется befroe cmd.exe где-нибудь в пути - person Mawg says reinstate Monica; 26.03.2010
comment
@mawg, оригинал был для того места, где вы знаете расширение, поскольку он отражает его в UNIX (где этот обман с добавлением расширений не происходит). Теперь я добавил одну, которая может делать то, что вы хотите, но это уже не простая команда, а скорее скрипт. Сначала он пробует команду без прикрас, а затем каждую из дополнительных. Надеюсь, это поможет. Вы можете настроить его по своему усмотрению (например, если вам нужен такой же порядок поиска, как в Windows - здесь показаны все возможности). - person paxdiablo; 26.03.2010
comment
Чтобы превратить это в пакетный сценарий, создайте файл с именем which.bat: @echo off for %%i in (%1) do @echo. %%~$PATH:%i. Чтобы добавить его в сценарий alias.bat, который вы загружаете каждый раз при запуске cmd.exe (поместите указанный выше сценарий в новый каталог с именем C: \ usr \ псевдонимы): DOSKEY which=C:\usr\aliases\which.bat $* Затем вы можете создать сценарий для запуска cmd.exe с файлом alias.bat: cmd.exe /K E:\usr\aliases\alias.bat - person Brad T.; 26.04.2014
comment
Стоит отметить, что пример for %i in (_____) do @echo. %~$PATH:i найдет любое расширение, а не только exe. Он работает для файла a.a или youtube-dl.py, если он находится в пути. Но забавно, если вы помещаете туда каталог, он выводит его, даже если он не находится в пути, например. for %i in (%TEMP%) do @echo. %~$PATH:i - person barlop; 13.06.2014
comment
Спасибо, я работаю над Windows 7 без команды where, и это делает работу - person s.ouchene; 20.02.2019

В PowerShell Get-Command < / a> найдет исполняемые файлы где угодно в $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 можно определять псевдонимы, which можно определить так.

$ sal which gcm   # short form of `Set-Alias which Get-Command`
$ which foo
...

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

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

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

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

В отличие от UNIX, где исполняемые файлы - это файлы с установленным битом исполняемого файла (+x), исполняемые файлы в Windows - это файлы, находящиеся в одном из каталогов, указанных в $PATH env. переменная, суффиксы имени файла которой указаны в $PATHEXT env. переменная (по умолчанию .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL).

Как _18 _ тоже чтит это env. переменную, ее можно расширить, добавив в нее список пользовательских исполняемых файлов. например

$ $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

Дополнительные параметры и примеры см. В Get-Command.

person shalomb    schedule 26.11.2014
comment
Он находит гораздо больше, чем просто исполняемые файлы. Он также ловит командные файлы - person Maximilian Burszley; 01.12.2018
comment
@ TheIncorrigible1 - если вы имеете в виду командные файлы, такие как командные файлы (.BAT, .CMD и т. Д.), Они считаются исполняемыми, потому что их расширения указаны в переменной PATHEXT (которая по умолчанию равна PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL). Другие типы исполняемых файлов (например, .py, .rb и т. Д.) Могут быть добавлены путем добавления расширения файла и создания исполняемой ассоциации с _7 _ / _ 8_ - например, docs.python.org/3.3/ используя / - person shalomb; 07.01.2019
comment
Честно говоря, сейчас, когда наступил 2020 год, этот ответ следует выбрать как лучший, поскольку исходный ответ был опубликован еще в 2008 году. Времена изменились. PowerShell - это способ, особенно потому, что этот ответ теперь кроссплатформенный для всех, где существует PowerShell. - person ScriptAutomate; 16.06.2020

В Windows PowerShell:

set-alias which where.exe
person cmcginty    schedule 30.11.2012

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

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

Подробнее здесь: Мой Манвич! PowerShell Какой

person RexE    schedule 20.11.2008
comment
Я искал именно эту лаконичную команду PowerShell. Я использовал where.exe, но необходимость возиться с кодом ошибки поверх синтаксического анализа его вывода намного уступает нативному решению PowerShell. Спасибо! - person scobi; 27.10.2012
comment
Но ($Env:Path).Split(";") | Get-ChildItem -filter programName* так легко набирать ... ;-) - person Craig; 30.11.2014
comment
Это также не работает, если в вашем пути есть переменная, которая обычно разрешается системой (также известная как% JAVA_HOME%). - person dragon788; 13.04.2017
comment
Я не могу заставить which.exe работать, я пробовал это, и это сработало. - person Asfand Qazi; 11.05.2020
comment
gcm Ответом было бы гораздо лучше использовать PowerShell сегодня: stackoverflow.com/a/27140194/5340149 - person ScriptAutomate; 16.06.2020

Инструменты GnuWin32 содержат which, а также целый ряд других инструментов Unix.

person Ferruccio    schedule 20.11.2008

В Windows CMD which вызывает where:

$ where php
C:\Program Files\PHP\php.exe
person automatix    schedule 01.04.2016
comment
Где будут перечислены все доступные ресурсы. Для себя я использовал where pip и получил три результата. Я не уверен, какой из них выполнен. - person gis; 28.01.2021

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

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

person palswim    schedule 12.10.2010
comment
GnuWin32, упомянутый ранее Ферруччо, намного лучше в этом случае, поскольку у вас может быть только собственный исполняемый файл where. - person Piotr Dobrogost; 29.08.2011
comment
GnuWin32 великолепен, и я использую его, но если вам нужна эта функциональность без установки инструментов GnuWin32, то вариант where.exe кажется правильным решением. Хотя я помещаю инструменты GnuWin32 в общий ресурс \ bin $ в нашей сети, чтобы я мог использовать их с рабочих станций (и в пакетных файлах), на которых они не установлены локально. - person Craig; 30.11.2014
comment
Когда мы говорим об использовании Cygwin в Windows, я предпочитаю: cygpath -w `which ‹appname›` - person mpasko256; 08.09.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:
person Fez    schedule 31.07.2015
comment
Ни одно из других решений не помогло мне, но > get-command app.exe | format-list сработало отлично! - person Alexander McFarlane; 16.07.2018

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

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

Лакомые кусочки:

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

Скачайте unxutils отсюда: http://sourceforge.net/projects/unxutils/

gold на платформах Windows, помещает все прекрасные утилиты unix в стандартную Windows DOS. Пользуюсь им уже много лет.

В нем есть "который" включен. Обратите внимание, что это чувствительно к регистру.

NB: чтобы установить его, взорвите zip где-нибудь и добавьте ... \ UnxUtils \ usr \ local \ wbin \ в переменную env вашего системного пути.

person Jon Court    schedule 26.03.2010
comment
это не чувствительно к регистру, также я должен сказать, какой java.exe вместо java - windows 7 - person Kalpesh Soni; 22.05.2013
comment
У него есть несколько разочарований, хотя он связан с новыми строками; Например, grep не будет соответствовать EOL, если вы не укажете . для \ r. Хотя это точно решение на 99%! - person dash-tom-bang; 28.07.2015
comment
Да, регистр не учитывается, однако по умолчанию имена файлов в Windows также не чувствительны к регистру. - person Wernfried Domscheit; 10.02.2020

Если вы можете найти бесплатный компилятор Pascal, вы можете скомпилировать его. По крайней мере, он работает и показывает необходимый алгоритм.

program Whence (input, output);
  Uses Dos, my_funk;
  Const program_version = '1.00';
        program_date    = '17 March 1994';
  VAR   path_str          : string;
        command_name      : NameStr;
        command_extension : ExtStr;
        command_directory : DirStr;
        search_dir        : DirStr;
        result            : DirStr;


  procedure Check_for (file_name : string);
    { Check existence of the passed parameter. If exists, then state so   }
    { and exit.                                                           }
  begin
    if Fsearch(file_name, '') <> '' then
    begin
      WriteLn('DOS command = ', Fexpand(file_name));
      Halt(0);    { structured ? whaddayamean structured ? }
    end;
  end;

  function Get_next_dir : DirStr;
    { Returns the next directory from the path variable, truncating the   }
    { variable every time. Implicit input (but not passed as parameter)   }
    { is, therefore, path_str                                             }
    var  semic_pos : Byte;

  begin
      semic_pos := Pos(';', path_str);
      if (semic_pos = 0) then
      begin
        Get_next_dir := '';
        Exit;
      end;

      result := Copy(Path_str, 1, (semic_pos - 1));  { return result   }
      { Hmm! although *I* never reference a Root drive (my directory tree) }
      { is 1/2 way structured), some network logon software which I run    }
      { does (it adds Z:\ to the path). This means that I have to allow    }
      { path entries with & without a terminating backslash. I'll delete   }
      { anysuch here since I always add one in the main program below.     }
      if (Copy(result, (Length(result)), 1) = '\') then
         Delete(result, Length(result), 1);

      path_str := Copy(path_str,(semic_pos + 1),
                       (length(path_str) - semic_pos));
      Get_next_dir := result;
  end;  { Of function get_next_dir }

begin
  { The following is a kludge which makes the function Get_next_dir easier  }
  { to implement. By appending a semi-colon to the end of the path         }
  { Get_next_dir doesn't need to handle the special case of the last entry }
  { which normally doesn't have a semic afterwards. It may be a kludge,    }
  { but it's a documented kludge (you might even call it a refinement).    }
  path_str := GetEnv('Path') + ';';

  if (paramCount = 0) then
  begin
    WriteLn('Whence: V', program_version, ' from ', program_date);
    Writeln;
    WriteLn('Usage: WHENCE command[.extension]');
    WriteLn;
    WriteLn('Whence is a ''find file''type utility witha difference');
    Writeln('There are are already more than enough of those :-)');
    Write  ('Use Whence when you''re not sure where a command which you ');
    WriteLn('want to invoke');
    WriteLn('actually resides.');
    Write  ('If you intend to invoke the command with an extension e.g ');
    Writeln('"my_cmd.exe param"');
    Write  ('then invoke Whence with the same extension e.g ');
    WriteLn('"Whence my_cmd.exe"');
    Write  ('otherwise a simple "Whence my_cmd" will suffice; Whence will ');
    Write  ('then search the current directory and each directory in the ');
    Write  ('for My_cmd.com, then My_cmd.exe and lastly for my_cmd.bat, ');
    Write  ('just as DOS does');
    Halt(0);
  end;

  Fsplit(paramStr(1), command_directory, command_name, command_extension);
  if (command_directory <> '') then
  begin
WriteLn('directory detected *', command_directory, '*');
    Halt(0);
  end;

  if (command_extension <> '') then
  begin
    path_str := Fsearch(paramstr(1), '');    { Current directory }
    if   (path_str <> '') then WriteLn('Dos command = "', Fexpand(path_str), '"')
    else
    begin
      path_str := Fsearch(paramstr(1), GetEnv('path'));
      if (path_str <> '') then WriteLn('Dos command = "', Fexpand(path_str), '"')
                          else Writeln('command not found in path.');
    end;
  end
  else
  begin
    { O.K, the way it works, DOS looks for a command firstly in the current  }
    { directory, then in each directory in the Path. If no extension is      }
    { given and several commands of the same name exist, then .COM has       }
    { priority over .EXE, has priority over .BAT                             }

    Check_for(paramstr(1) + '.com');     { won't return if file is found }
    Check_for(paramstr(1) + '.exe');
    Check_for(paramstr(1) + '.bat');

    { Not in current directory, search through path ... }

    search_dir := Get_next_dir;

    while (search_dir <> '') do
    begin
       Check_for(search_dir + '\' + paramstr(1) + '.com');
       Check_for(search_dir + '\' + paramstr(1) + '.exe');
       Check_for(search_dir + '\' + paramstr(1) + '.bat');
       search_dir := Get_next_dir;
    end;

    WriteLn('DOS command not found: ', paramstr(1));
  end;
end.
person Mawg says reinstate Monica    schedule 26.03.2010
comment
Вау, есть люди, которые все еще используют Паскаль? :-) - person paxdiablo; 26.03.2010
comment
Я полагаю, что есть. Но не я. Вы видели строку program_date = '17 March 1994 '; - person Mawg says reinstate Monica; 26.03.2010
comment
Блок my_funk; не нужен. Спасибо за размещение программы на Паскале, напоминает мне о моей юности! Очень жаль, что Паскаль не эволюционировал. - person yannis; 27.08.2015
comment
О, но это было так. Например, теперь он объектно-ориентированный. На lazarus-ide.org есть отличная бесплатная кроссплатформенная реализация и IDE. прямой потомок Borland до сих пор живет в Delphi по адресу embarcadero.com/products/delphi, что очень дорого (imo) по цене 299 долларов за стартовую версию и 1 тысячу долларов за полезную версию. Однако он кроссплатформенный - windows, iOs, Mac, Android. Получите пробную версию или воспользуйтесь Lazarus и почувствуйте себя на 20 лет моложе, -) - person Mawg says reinstate Monica; 27.08.2015
comment
@yannis, как жаль, что Паскаль не развился ... Вы имеете в виду, кроме "Turbo Pascal" Андерс, который занимается разработкой C #? - person piers7; 18.11.2015
comment
Или Дельфи, или Лазарь? Такая крошечная вещь, как объектная ориентация, не считается эволюцией? - person Mawg says reinstate Monica; 18.11.2015
comment
@Mawg Delphi был правильным выбором. После версии 6 и когда все ребята из Borland ушли в Microsoft, это оттолкнуло многих, включая меня. - person yannis; 19.11.2015
comment
И теперь он стоит минимум 1 тыс. Долларов (!), Если вы не купите стартовую версию за 299 долларов, которая очень ограничена (последняя купленная мной стартовая версия не имела генерации 64-битного кода и, что еще хуже для меня, доступа к базе данных). Lazarus великолепен, но главный плюс Delphi - это тысячи (бесплатных) компонентов VCL. - person Mawg says reinstate Monica; 19.11.2015
comment
На данный момент (начало 2018 г.) они, должно быть, осознали, что теряют обычаи, и стартовую версию теперь бесплатен (пока вы не заработаете на нем 1 тыс. долларов США). Это всего лишь 32-разрядная версия, но есть бесплатные решения для ограничений. Либо так, либо Лазарь хорошо выглядишь - person Mawg says reinstate Monica; 27.03.2018
comment
И теперь, в декабре 2020 года, у него есть версия для сообщества - ностальгируйте по себе - person Mawg says reinstate Monica; 05.12.2020

Отсутствует в стандартной версии Windows, но предоставляется Services for Unix, и есть несколько простых пакетных сценариев, которые выполняют одно и то же, например, этот этот .

person Robert Gamble    schedule 20.11.2008
comment
За исключением того, что команда, которую вы связываете, выводит только переменную PATH и даже не проверяет, найден ли там файл. - person Angel O'Sphere; 16.07.2013

Лучшая версия, которую я нашел в Windows, - это утилита "whereis" Джозефа Новичка, которая доступна (с исходным кодом) по адресу его сайт.

Стоит прочитать статью о разработке «whereis».

person Tim Lesher    schedule 20.11.2008
comment
Поздний комментарий: где есть проблемы с поиском 64-битных исполняемых файлов под Win 7 64-бит. - person Axel Kemper; 16.01.2016

Ни один из Win32-портов Unix, которые я смог найти в Интернете, не является удовлетворительным, потому что все они имеют один или несколько из следующих недостатков:

  • Не поддерживается переменная Windows PATHEXT. (Это определяет список расширений, неявно добавляемых к каждой команде перед сканированием пути, и в каком порядке.) (Я использую много сценариев tcl, и не существует общедоступных инструментов, которые могли бы их найти.)
  • Нет поддержки кодовых страниц cmd.exe, из-за чего они неправильно отображают пути с символами, отличными от ascii. (Я очень чувствителен к этому, с ç в моем имени :-))
  • Нет поддержки отдельных правил поиска в cmd.exe и командной строке PowerShell. (Ни один общедоступный инструмент не найдет сценарии .ps1 в окне PowerShell, но не в окне cmd!)

В конце концов, я написал свой собственный, который правильно поддерживает все вышеперечисленное.

Доступно там: http://jf.larvoire.free.fr/progs/which.exe < / а>

person Jean-François Larvoire    schedule 18.12.2014
comment
К вашему сведению, я открыл исходный код для упомянутого выше инструмента which.exe и многих других на github.com/JFLarvoire/ SysToolsLib. Здесь вы можете получить последнюю версию, сообщить о проблемах и т. Д. - person Jean-François Larvoire; 11.05.2016

Этот пакетный файл использует обработку переменных CMD, чтобы найти команду, которая будет выполнена в пути. Примечание: текущий каталог всегда находится перед путем) и в зависимости от того, какой вызов API используется, поиск других местоположений выполняется до / после пути.

@echo off
echo. 
echo PathFind - Finds the first file in in a path
echo ======== = ===== === ===== ==== == == = ====
echo. 
echo Searching for %1 in %path%
echo. 
set a=%~$PATH:1
If "%a%"=="" (Echo %1 not found) else (echo %1 found at %a%)

См. set /? для получения помощи.

person Community    schedule 25.09.2016

Вы можете сначала установить Git из загрузки Git, а затем открыть Git Bash и введите:

which app-name
person hamidreza samsami    schedule 02.08.2017

Я использую GOW (GNU в Windows), которая является облегченной версией Cygwin. Вы можете получить его на GitHub, здесь.

GOW (GNU для Windows) - легкая альтернатива Cygwin. Он использует удобный установщик Windows, который устанавливает около 130 чрезвычайно полезных приложений UNIX с открытым исходным кодом, скомпилированных как собственные двоичные файлы Win32. Он спроектирован так, чтобы быть как можно меньше, около 10 МБ, в отличие от Cygwin, который может работать более 100 МБ в зависимости от параметров. - Описание (Брент Р. Матцель)

Снимок экрана со списком команд, включенных в GOW:

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

person Prayson W. Daniel    schedule 13.12.2017

Я создал инструмент, похожий на Ned Batchelder:

Поиск файлов .dll и .exe в PATH

Хотя мой инструмент предназначен в первую очередь для поиска различных версий dll, он показывает дополнительную информацию (дату, размер, версию), но не использует PATHEXT (я надеюсь, что скоро обновлю свой инструмент).

person Michał Niklas    schedule 20.11.2008

Просто нужно опубликовать этот пакетный файл с одним лайнером для Windows:

C:>type wh.cmd
@for %%f in (%*) do for %%e in (%PATHEXT% .dll .lnk) do for %%b in (%%f%%e) do for %%d in (%PATH%) do if exist %%d\%%b echo %%d\%%b

Тест:

C:>wh ssh
C:\cygwin64\bin\ssh.EXE
C:\Windows\System32\OpenSSH\\ssh.EXE

Не совсем однострочный, если вы заключите код в setlocal enableextensions и endlocal.

person bobbogo    schedule 08.10.2019
comment
Я предпочел бы это в нескольких строках, чтобы я мог это понять. ;-) - person Gringo Suave; 31.10.2019

Для вас, пользователей Windows XP (у которых нет встроенной команды where), я написал команду «where like» в виде rubygem под названием whichr.

Чтобы установить его, установите Ruby.

потом

gem install whichr

Запустите это так:

C:> какой cmd_here

person rogerdpack    schedule 02.09.2015
comment
Я подозреваю, что вас отвергают, потому что вы предлагаете что-либо делать в Windows XP. - person sebastian-c; 11.06.2018
comment
Я не голосовал против, но установить Ruby для реализации тривиальной команды тоже сложно. Выше есть цикл for, который можно поместить в пакетный скрипт. - person Gringo Suave; 31.10.2019
comment
Печатает ли он вступительные строки к музыкальной теме для Ведьмак, если вы запустите его в подробном режиме? ;) - person Agi Hammerthief; 25.11.2019

TCC и TCC / LE от JPSoft - это замены CMD.EXE, которые добавляют значительную функциональность. Относительно вопроса OP, which - это встроенная команда для командных процессоров семейства TCC.

person David G    schedule 09.02.2017

Я довольно давно использую модуль which от npm, и он работает очень хорошо: https://www.npmjs.com/package/which Это отличная многоплатформенная альтернатива.

Теперь я переключился на which, который поставляется с Git. Просто добавьте к своему пути /usr/bin путь из Git, который обычно находится в C:\Program Files\Git\usr\bin\which.exe. Бинарный файл which будет иметь адрес C:\Program Files\Git\usr\bin\which.exe. Это быстрее и работает так, как ожидалось.

person Giovanni Bassi    schedule 01.06.2018

попробуй это

set a=%~$dir:1
If "%for%"=="" (Echo %1 not found) else (echo %1 found at %a%)
person Community    schedule 03.05.2019

Можно загрузить все команды UNIX, скомпилированные для Windows, включая which, из этого репозитория GitHub: https://github.com/George-Ogden/UNIX

person George Ogden    schedule 04.07.2020

Вот функция, которую я сделал, чтобы найти исполняемый файл, похожий на команду Unix WHICH.

app_path_func.cmd:

@ECHO OFF
CLS

FOR /F "skip=2 tokens=1,2* USEBACKQ" %%N IN (`reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\%~1" /t REG_SZ  /v "Path"`) DO (
 IF /I "%%N" == "Path" (
  SET wherepath=%%P%~1
  GoTo Found
 )
)

FOR /F "tokens=* USEBACKQ" %%F IN (`where.exe %~1`) DO (
 SET wherepath=%%F
 GoTo Found
)

FOR /F "tokens=* USEBACKQ" %%F IN (`where.exe /R "%PROGRAMFILES%" %~1`) DO (
 SET wherepath=%%F
 GoTo Found
)

FOR /F "tokens=* USEBACKQ" %%F IN (`where.exe /R "%PROGRAMFILES(x86)%" %~1`) DO (
 SET wherepath=%%F
 GoTo Found
)

FOR /F "tokens=* USEBACKQ" %%F IN (`where.exe /R "%WINDIR%" %~1`) DO (
 SET wherepath=%%F
 GoTo Found
)

:Found
SET %2=%wherepath%
:End

Тест:

@ECHO OFF
CLS

CALL "app_path_func.cmd" WINWORD.EXE PROGPATH
ECHO %PROGPATH%

PAUSE

Результат:

C:\Program Files (x86)\Microsoft Office\Office15\
Press any key to continue . . .

https://www.freesoftwareservers.com/display/FREES/Find+Executable+via+Batch+-+Microsoft+Office+Example+-+WINWORD+-+Find+Microsoft+Office+Path

person FreeSoftwareServers    schedule 05.08.2020