Есть ли эквивалент «который» в командной строке 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

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

paxdiablo
источник
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.

shalomb
источник
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 который

REXE
источник
1
Я искал эту точную команду PowerShell. Я использовал where.exe, но необходимость возиться с кодом ошибки поверх синтаксического анализа его вывода намного уступает нативному решению powershell. Спасибо!
scobi
9
Но ($Env:Path).Split(";") | Get-ChildItem -filter programName*это так легко набрать ... ;-)
Крейг
Это также дает сбой, если в вашем пути есть переменная, которая обычно разрешается системой (aka% JAVA_HOME%).
dragon788
Я не могу заставить which.exe работать, я попробовал это, и это сработало.
Асфанд Кази
37

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

Ферруччо
источник
24

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

$ where php
C:\Program Files\PHP\php.exe
automatix
источник
17

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

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

palswim
источник
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.
Mawg говорит восстановить Монику
источник
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.
Аксель Кемпер
7

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

which app-name
хамидреза самсами
источник
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.

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

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

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

затем

gem install whichr

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

C:> whor cmd_here

rogerdpack
источник
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%)

источник