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


2354

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

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

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


3
Foredecker: «which» ищет в PATH исполняемый файл, который будет запущен, если вы введете команду в командной строке.
— Грег Хьюгилл

3
Например, если у вас установлено 5 версий Java, и вы не знаете, какая из них используется, вы можете ввести «какой java», и это даст вам PATH для двоичного кода
— nineided

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

36
Я знаю, что этот вопрос возник до появления SuperUser, но, вероятно, он здесь.
— Palswim

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

Ответы:


2553

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

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

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


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

12
@ Ajedi32 - Правильно, чего нет в XP. Как я уже сказал, «Windows Server 2003 и более поздние версии».
— Майкл Ратанапинта

24
Работает в Windows 8
— граб

58
обратите внимание, что это не будет работать в powershell, если вы не введете where.exe
— JonnyRaa

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

288

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

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


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

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

Windows распознает как исполняемый файл больше, чем .exe. В прошлый раз, когда я whichзадал код в днях W95 / DOS, порядок поиска был следующим: текущий каталог, затем каждый путь dir, для cmd.com, затем cmd.exe, затем cmd.bat. Таким образом, даже cmd.bat в текущем каталоге выполнил befroe cmd.exe soemwhere в пути
— Mawg говорит восстановить Monica

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

2
Чтобы превратить это в пакетный скрипт, создайте файл с именем «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
— Брэд Т.

152

Под 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и т. Д., Определенные для текущей оболочки (довольно похоже на Bash type -a foo), что делает его более подходящим, чем другие инструменты, такие как 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
...

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

Чтобы найти другие неиспользуемые исполняемые файлы (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.


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

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


40

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

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

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


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

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

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

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



17

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

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


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

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

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

12

В 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

11

У меня есть функция в моем профиле PowerShell под названием «который»

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сработало отлично!
— Александр Макфарлейн

10

Получите unxutils отсюда: http://sourceforge.net/projects/unxutils/

золото на платформах Windows, ставит все приятные утилиты Unix на стандартную Windows DOS. Использую его годами.

В него включено «которое». Обратите внимание, что он чувствителен к регистру, хотя.

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


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

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

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

8

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


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

8

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

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

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

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

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

1
@yannis "Жаль, что Паскаль не эволюционировал" ... кроме Андерса из "Турбо Паскаля", продолжающего разрабатывать C #, ты имеешь в виду?
— piers7

7

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

Статья о разработке "whereis" стоит прочитать.


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


6

Ни один из 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 . Там вы можете получить последнюю версию, сообщить о проблемах и т. Д.
— Жан-Франсуа Ларвуар

6

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


6

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

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

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

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


5

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

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

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


5

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


2
Предпочел бы, чтобы в несколько строк, чтобы я мог понять это. ;-)
— Гринго Суаве

4

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

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

затем

gem install whichr

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

C:> whor cmd_here


3
Я подозреваю, что вас опускают, потому что вы предлагаете сделать что-нибудь на Windows XP.
— Себастьян-ц

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

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

3

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


2

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


1

попробуй это

set a=%~$dir:1
If "%for%"=="" (Echo %1 not found) else (echo %1 found at %a%)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.