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

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

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

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

Что делает "which" в Unix?

Foredecker 20.11.2008 07:21

Foredecker: "which" выполняет поиск в PATH исполняемого файла, который будет запущен, если вы введете команду в приглашении оболочки.

Greg Hewgill 20.11.2008 07:28

например, если у вас установлено 5 версий Java, и вы не знаете, какая из них используется, вы можете ввести «which java» и получить ПУТЬ к двоичному файлу.

ninesided 20.11.2008 07:41

@Foredecker, MR говорит, что это «где» в Win2k3, но Win2k3 не является частью вопроса. Если «где» нет в других версиях Windows, другие ответы также действительны. IMNSHO, лучший ответ, который работает во всех версиях Windows. Кроме того, другие ответы не ошибочны, просто разные способы сделать это.

paxdiablo 22.11.2008 15:55

Я знаю, что этот вопрос возник перед SuperUser, но он, вероятно, принадлежит ему.

palswim 12.10.2010 21:04

Этот вопрос был задан в других потоках: [Эквивалент команды * Nix 'which' в Powershell?] [1] [Powershell, эквивалент команды unix which?] [2] [1]: stackoverflow.com/questions/63805/… [2]: superuser.com/questions/34492/…

Anonymous 13.12.2011 09:23

Мне очень пригодился этот командный файл pankaj-k.net/weblog/2004/11/equivalent_of_which_in_windows.h‌ tml

Etienne 22.09.2011 00:58

Вы можете получить командный файл размером всего 90 байт отсюда: blogs.msdn.com/b/oldnewthing/archive/2005/01/20/357225.aspx Или запустить программу C# - ссылка размещена на веб-сайте выше.

Lukasz Czerwinski 28.12.2010 15:04

В стандартном Unix нет команды which. Утилита POSIX - type. В оболочке C есть команда which, а в некоторых системах она используется как внешний исполняемый файл. Например, в Debian Linux which поступает из пакета под названием debutils. Этот внешний which не «видит» встроенные оболочки, псевдонимы или функции. type делает; type Bash имеет возможность подавить это и просто выполнить поиск пути.

Kaz 17.04.2015 19:09

Чтобы проиллюстрировать точку зрения @kaz, сравните выходы which -a pwd и type -a pwd.

MarcH 16.10.2019 05:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2 511
10
664 845
26
Перейти к ответу Данный вопрос помечен как решенный

Ответы 26

Нет в стандартной Windows, но он предоставляется Сервисы для Unix, и есть несколько простых пакетных сценариев, которые выполняют то же самое, например этот Вот этот.

За исключением того, что команда, которую вы связываете, выводит только переменную PATH и даже не проверяет, найден ли там файл.

Angel O'Sphere 16.07.2013 17:20

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

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

Поздний комментарий: где есть проблемы с поиском 64-битных исполняемых файлов под Win 7 64-бит.

Axel Kemper 16.01.2016 22:50

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

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

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

Я искал именно эту лаконичную команду PowerShell. Я использовал where.exe, но необходимость возиться с кодом ошибки поверх синтаксического анализа его вывода намного уступает нативному решению PowerShell. Спасибо!

scobi 27.10.2012 06:17

Но ($Env:Path).Split(";") | Get-ChildItem -filter programName* так легко набирать ... ;-)

Craig 30.11.2014 11:56

Это также не работает, если в вашем пути есть переменная, которая обычно разрешается системой (также известная как% JAVA_HOME%).

dragon788 13.04.2017 18:18

Я не могу заставить which.exe работать, я пробовал это, и это сработало.

Asfand Qazi 11.05.2020 22:14

Ответом gcm было бы гораздо лучше использовать PowerShell сегодня: stackoverflow.com/a/27140194/5340149

ScriptAutomate 16.06.2020 22:32

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

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

Привет, если бы я узнал это! Жаль, что это не работает с MS-DOS или Win9x (то есть с command.com). (У Раймонда Чена есть более «продуманная» версия, которую можно превратить в командный файл: blogs.msdn.com/oldnewthing/archive/2005/01/20/357225.aspx)

Michael Ratanapintha 01.01.2009 06:27

@Michael, если вы все еще используете DOS или Win95, поиск исполняемых файлов на пути - это наименее ваших проблем :-)

paxdiablo 09.04.2009 09:41

Windows распознает больше, чем .exe, как исполняемый файл. В прошлый раз, когда я кодировал which еще в дни W95 / DOS, порядок поиска был - текущий каталог, затем каждый каталог пути, для cmd.com, затем cmd.exe, затем cmd.bat Итак, даже cmd.bat в текущем каталоге выполняется befroe cmd.exe где-нибудь в пути

Mawg says reinstate Monica 26.03.2010 03:46

@mawg, оригинал был для того места, где вы знаете расширение, поскольку он отражает его в UNIX (где этот обман с добавлением расширений не происходит). Теперь я добавил одну, которая может делать то, что вы хотите, но это уже не простая команда, а скорее скрипт. Сначала он пробует неукрашенную команду, а затем каждую из дополнительных. Надеюсь, это поможет. Вы можете настроить его по своему усмотрению (например, если вам нужен такой же порядок поиска, как в Windows - здесь показаны все возможности).

paxdiablo 26.03.2010 04:34

Чтобы превратить это в пакетный сценарий, создайте файл с именем "which.bat": @echo off for %%i in (%1) do @echo. %%~$PATH:%i Чтобы добавить его в сценарий alias.bat, который вы загружаете каждый раз при запуске cmd.exe (поместите указанный выше сценарий в новый каталог с именем C: \ usr \ aliases): DOSKEY which=C:\usr\aliases\which.bat $* Затем вы можете создать скрипт для запуска cmd.exe с файлом alias.bat: cmd.exe /K E:\usr\aliases\alias.bat

Brad T. 26.04.2014 00:42

Стоит отметить, что на примере for %i in (_____) do @echo. %~$PATH:i найдется любое расширение, а не только exe. Он работает для файла a.a или youtube-dl.py, если он находится в пути. Но это забавно, если вы помещаете туда каталог, он выводит его, даже если он не находится в пути, например. for %i in (%TEMP%) do @echo. %~$PATH:i

barlop 13.06.2014 14:40

Спасибо, я работаю над Windows 7 без команды where, и это делает работу

s.ouchene 20.02.2019 23:12
Ответ принят как подходящий

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

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

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

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

Michael Ratanapintha 11.12.2011 03:46

@ Ajedi32 - Верно, который отсутствует в XP. Как я уже сказал, «Windows Server 2003 и новее».

Michael Ratanapintha 25.09.2012 09:40

@MichaelRatanapintha Да, почему-то я подумал, что Windows Server 2003 была создана до Windows XP. Чувак, XP старый ...

Ajedi32 25.09.2012 19:51

следите за тем, чтобы этот не будет работать в PowerShell, если вы не наберете where.exe

JonnyRaa 28.01.2014 18:46

Предупреждение: "where" не будет работать с цитируемыми путями, убедитесь, что ваш% path% не содержит их.

Drealmer 27.07.2014 22:06

Помните, что where.exe не является встроенной оболочкой, вам необходимо иметь %windir%\system32 на вашем %PATH% - что может быть не так, поскольку использование where предполагает, что вы можете работать над проблемами с вашим путем!

Tomasz Gandor 08.07.2015 12:00

Не работал в CMD на сервере 2016 без ввода where.exe

Edward 08.01.2017 04:12

Powershell Get-Command или gcm, как упоминалось в другом ответе, эквивалентен where

tkokasih 06.09.2017 08:51

Также работает в Windows 10.

Emil Stenström 08.02.2018 17:50

Чтобы быть явным: where.exe может возвращать несколько значений, и в этом случае будет вызвано первое / самое верхнее из них. C:\Windows\System32> where.exe sqlcmd.exec:\Program Files\Microsoft SQL Server\90\Tools\Binn\SQLCMD.EXEC:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXEC:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\SQLCMD.EXE

phantom-99w 13.11.2018 16:45

Действительно ли where действителен вне выражения select? В противном случае я бы счел это ошибкой, поскольку из контекста должно быть очевидно, что where.exe предназначен, когда это первое, что вводится в командной строке.

Chiramisu 12.05.2020 11:34

Сделал еще один шаг и сделал функцию поиска по пути и программным файлам / окнам и т. д. Может легко использоваться в качестве адаптера. См. stackoverflow.com/a/63257980/5079799

FreeSoftwareServers 05.08.2020 06:29

re: where.exe may return multiple values Но НЕ обязательно в порядке каталогов в вашей переменной среды echo %PATH%. В Windows есть как переменная PATH пользовательского уровня, так и переменная PATH системного уровня. echo %PATH% отображает системную переменную, но which.exe сначала использует переменную уровня пользователя. Сюрприз!

Jesse Chisholm 10.12.2020 06:05

У инструментов GnuWin32 есть which, наряду с целым рядом других инструментов Unix.

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

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

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

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

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

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

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

он не чувствителен к регистру, также я должен сказать, какой java.exe вместо java - windows 7

Kalpesh Soni 22.05.2013 23:46

У него есть несколько разочарований, хотя он связан с новыми строками; Например, grep не будет соответствовать EOL, если вы не добавите . для \ r. Хотя это точно решение на 99%!

dash-tom-bang 28.07.2015 23:01

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

Wernfried Domscheit 10.02.2020 13:50

Если вы можете найти бесплатный компилятор 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.

Вау, есть люди, которые все еще используют Паскаль? :-)

paxdiablo 26.03.2010 04:30

Я полагаю, что есть. Но не я. Вы видели строку program_date = '17 March 1994 ';

Mawg says reinstate Monica 26.03.2010 15:12

Блок my_funk; не нужен. Спасибо за размещение программы на Паскале, напоминает мне о моей юности! Очень жаль, что Паскаль не эволюционировал.

yannis 27.08.2015 11:41

О, но это было так. Например, теперь он объектно-ориентированный. В lazarus-ide.org есть отличная бесплатная кроссплатформенная реализация и IDE. И прямой потомок Borland все еще живет в Delphi в embarcadero.com/products/delphi, что очень дорого (imo) - 299 долларов за стартовую версию и 1 тысячу долларов за «полезную» версию. Однако он кроссплатформенный - windows, iOs, Mac, Android. Получите пробную версию или воспользуйтесь Lazarus и почувствуйте себя на 20 лет моложе, -)

Mawg says reinstate Monica 27.08.2015 16:36

@yannis "как жаль, что Паскаль не эволюционировал" ... Вы имеете в виду, не считая "Turbo Pascal" Андерс, который занимается разработкой C#?

piers7 18.11.2015 11:01

Или Дельфи, или Лазарь? Такая мелочь, как объектная ориентация, не считается эволюцией?

Mawg says reinstate Monica 18.11.2015 11:09

@Mawg Delphi был правильным выбором. После версии 6 и когда все ребята из Borland ушли в Microsoft, это оттолкнуло многих, включая меня.

yannis 19.11.2015 08:44

И теперь он стоит минимум 1 тыс. Долларов (!), Если вы не купите стартовую версию за 299 долларов, которая очень ограничена (последняя купленная мной стартовая версия не имела генерации 64-битного кода и, что еще хуже для меня, доступа к базе данных). Lazarus великолепен, но главный плюс Delphi - это тысячи (бесплатных) компонентов VCL.

Mawg says reinstate Monica 19.11.2015 15:47

На данный момент (начало 2018 г.) они, должно быть, осознали, что теряют обычай, и стартовая версия теперь бесплатен (пока вы не заработаете на нем 1 тыс. Долларов США). Это всего лишь 32 бита, но есть бесплатные решения для ограничения. Либо так, либо Лазарь хорошо выглядишь

Mawg says reinstate Monica 27.03.2018 10:20

И теперь, в декабре 2020 года, у него есть общественное издание - ностальгируйте по себе.

Mawg says reinstate Monica 05.12.2020 20:38

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

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

GnuWin32, упомянутый ранее Ферруччо, намного лучше в этом случае, поскольку у вас может быть только собственный исполняемый файл где.

Piotr Dobrogost 29.08.2011 13:15

GnuWin32 великолепен, и я использую его, но если вам нужна эта функциональность без установки инструментов GnuWin32, то вариант where.exe кажется правильным решением. Хотя я помещаю инструменты GnuWin32 в общий ресурс \ bin $ в нашей сети, чтобы я мог использовать их с рабочих станций (и в пакетных файлах), на которых они не установлены локально.

Craig 30.11.2014 11:57

Когда мы говорим об использовании Cygwin в Windows, я предпочитаю: cygpath -w "` which <appname> `"

mpasko256 08.09.2015 14:27

В Windows PowerShell:

set-alias which where.exe

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

Он находит гораздо больше, чем просто исполняемые файлы. Он также ловит командные файлы

Maximilian Burszley 01.12.2018 00:43

@ TheIncorrigible1 - если вы имеете в виду командные файлы, например командные файлы (.BAT, .CMD и т. д.), Они считаются исполняемыми, потому что их расширения указаны в переменной PATHEXT (которая по умолчанию - PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MS‌​C;.CPL). Другие типы исполняемых файлов (например, .py, .rb и т. д.) Могут быть добавлены путем добавления расширения файла и создания исполняемой ассоциации с assoc / ftype - например, docs.python.org/3.3/using/…

shalomb 07.01.2019 00:19

Честно говоря, этот ответ должен быть выбран как лучший ответ сейчас, когда наступил 2020 год, поскольку исходный ответ был опубликован еще в 2008 году. Времена изменились. PowerShell - это способ, особенно потому, что этот ответ теперь кроссплатформенный для всех, где существует PowerShell.

ScriptAutomate 16.06.2020 22:29

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

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

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

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

К вашему сведению, я открыл исходный код моего инструмента which.exe, упомянутого выше, и многих других на github.com/JFLarvoire/SysToolsLib. Здесь вы можете получить последнюю версию, сообщить о проблемах и т. д.

Jean-François Larvoire 11.05.2016 16:44

У меня есть функция в моем профиле 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:

Ни одно из других решений не помогло мне, но > get-command app.exe | format-list работал отлично!

Alexander McFarlane 16.07.2018 12:30

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

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

Затем

gem install whichr

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

C:> какой cmd_here

Я подозреваю, что вас отвергают, потому что вы предлагаете что-либо делать в Windows XP.

sebastian-c 11.06.2018 18:35

Я не голосовал против, но установить Ruby для реализации тривиальной команды тоже сложно. Выше есть цикл for, который можно поместить в пакетный скрипт.

Gringo Suave 31.10.2019 20:48

Печатает ли он вводные строки музыкальной темы для Ведьмак, если вы запускаете его в подробном режиме? ;)

Agi Hammerthief 25.11.2019 15:51

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

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

Интересные факты:

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

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

$ where php
C:\Program Files\PHP\php.exe

Где будут перечислены все доступные ресурсы. Что касается меня, я использовал where pip и получил три результата. Я не уверен, какой из них исполнен.

gis 28.01.2021 17:59

Этот пакетный файл использует обработку переменных 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 /?.

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

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

which app-name

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

GOW (GNU on Windows) is the lightweight alternative to Cygwin. It uses a convenient Windows installer that installs about 130 extremely useful open source UNIX applications compiled as native win32 binaries. It is designed to be as small as possible, about 10 MB, as opposed to Cygwin which can run well over 100 MB depending upon options. - About Description(Brent R. Matzelle)

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

Enter image description here

Я довольно давно использую модуль 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. Это быстрее и работает так, как ожидалось.

попробуй это

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

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

Я предпочел бы это в нескольких строках, чтобы я мог это понять. ;-)

Gringo Suave 31.10.2019 20:49

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

Вот функция, которую я сделал, чтобы найти исполняемый файл, похожий на команду 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

Другие вопросы по теме