Чи є еквівалент "який" у командному рядку Windows?


2350

Оскільки у мене іноді виникають проблеми із шляхами, коли один із моїх власних скриптів cmd прихований (затінений) іншою програмою (раніше на шляху), я б хотів знайти повний шлях до програми в командному рядку Windows, просто його назва.

Чи є еквівалент команді UNIX "який"?

У UNIX which commandдрукує повний шлях даної команди, щоб легко знайти та виправити ці проблеми з тіні.


3
Foredecker: "котрий" шукає PATH для виконуваного файлу, який буде запущений, якщо ви введете команду в запиті оболонки.
Грег Хьюгілл

3
Наприклад, якщо у вас встановлено 5 версій Java, і ви не знаєте, яка з них використовується, ви можете ввести "який Java", і це дає вам PATH до двійкового
дев'ятисторічний

9
@Foredecker, MR каже, що це "куди" у Win2k3, але Win2k3 не був частиною питання. Якщо "де" немає в інших версіях Windows, інші відповіді також дійсні. IMNSHO, відповідь, яка працює на всіх версіях Windows, найкраща. Крім того, інші відповіді не помиляються, просто різні способи зробити це.
paxdiablo

36
Я знаю, що це питання виникло перед SuperUser, але воно, ймовірно, там і належить.
palswim

16
У whichстандартному Unix немає команди. Утиліта POSIX є type. Команда C має команду, яка є, і деякі системи мають її як зовнішній виконуваний файл. Наприклад, на Debian Linux whichпоходить від пакета під назвою debutils. Цей зовнішній whichне "бачить" вбудовані оболонки, псевдоніми та функції. typeробить; У Bash typeє можливість придушити це і просто зробити пошук шляху.
Каз

Відповіді:


2550

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

Спробуйте where /?допомогти.

Зверніть увагу , що Windows PowerShell визначає в whereякості псевдоніма в Where-Objectкомандлет , так що якщо ви хочете where.exe, ви повинні ввести повне ім'я замість опускаючи .exeрозширення.


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

12
@ Ajedi32 - Правильно, якого немає в XP. Як я вже сказав, "Windows Server 2003 і пізніших версій".
Майкл Ратанапінта

24
Працює в Windows 8
грабуйте

57
стежте за тим, що ця робота не працює в повноваженнях, якщо ви не введете 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
@Michael, якщо ви все ще використовуєте DOS або Win95, пошук виконавчих файлів на шляху - найменша проблема :-)
paxdiablo

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

3
@mawg, оригінал був для того, де ви знаєте розширення, оскільки воно відображає зображення під UNIX (де ця хитрість додавання розширень не відбувається). Зараз я додав таку, яка може робити те, що ви хочете, але це вже не проста команда, а стільки сценарій. Спершу спробує команду без відключень, а потім кожну з розширень. Сподіваюся, що це допомагає. Ви можете налаштувати його на свої потреби так, як вважаєте за потрібне (якщо ви хочете той самий порядок пошуку, що і у Windows, наприклад, у цьому показані всі можливості).
paxdiablo

2
Щоб перетворити це на пакетний скрипт, створіть файл під назвою "that.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
Бред Т.

151

У розділі 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
...

Пошук користувацьких виконуваних файлів

Щоб знайти інші виконувані файли, що не стосуються 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.


2
Це знаходить набагато більше, ніж просто виконувані файли. Він також ловить файли команд
Максиміліан Burszley

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 (що я рекомендую), ви можете використовувати таку команду як приблизний еквівалент (замінити programName на ім'я вашого виконавчого файла):

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

Більше тут: Мій Манвіч! PowerShell Які


1
Я шукав цю точну командну команду. Я використовував Where.exe, але мені потрібно возитися з кодом помилки на вершині розбору його результатів, набагато поступається вродженим рішенням PowerShell. Дякую!
Скобі

9
Але ($Env:Path).Split(";") | Get-ChildItem -filter programName*це так просто набрати ... ;-)
Крейг

Це також не вдається, якщо у вас є змінна у вашому шляху, яка зазвичай вирішується системою (ака% JAVA_HOME%).
dragon788

Я не можу заставити файл that.exe працювати, я спробував це, і воно спрацювало.
Асфанд Казі



17

Cygwin - це рішення. Якщо ви не проти використовувати сторонні рішення, то Cygwin - це шлях.

Cygwin надає вам комфорт * nix у середовищі Windows (і ви можете використовувати його у своїй командній оболонці Windows, або використовувати оболонку * nix на ваш вибір). Він дає вам цілий ряд команд * nix (як which) для Windows, і ви можете просто включити цей каталог у свій PATH.


10
Згаданий раніше Fernuccio GnuWin32 набагато кращий у цьому випадку, оскільки ви можете мати рідне місце, де виконується один.
Пьотр Доброгост

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

1
Коли ми говоримо про використання Cygwin у Windows, я віддаю перевагу: cygpath -w "` which <appname> `"
mpasko256

12

У 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

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. Використовували його роками.

Він містить "який" включений. Зауважте, що він враховує регістри.

Примітка: щоб встановити його, підірвіть поштовий індекс десь і додайте ... \ UnxUtils \ usr \ local \ wbin \ до змінної системи env env.


2
це не враховує регістр, також я повинен сказати, який java.exe замість якого java - windows 7
Kalpesh Soni

Він має кілька розчарувань, хоча пов'язаний з новими рядками; grep, наприклад, не відповідає EOL, якщо ви не введете .для \ r. Це 99% рішення, хоча точно!
dash-tom-bang

Так, він не відрізняється від регістру, однак за іменами файлів за замовчуванням у Windows також не враховуються регістри.
Wernfried Domscheit

8

Немає в наявності Windows, але вона надається Службами для Unix. Є кілька простих пакетних скриптів, що плавають навколо, що виконують те саме, що і цей .


1
За винятком того, що команда, яку ви посилаєте, виводить лише змінну PATH і навіть не перевіряє, чи файл там знайдений.
Angel O'Sphere

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 березня 1994 року ';
Мауг каже, що поверніть Моніку

1
Одиниця my_funk;непотрібна. Дякую за публікацію програми Pascal, нагадує про мою юність! Шкода, що Паскаль не розвивався.
янніс

2
О, але це було. Зараз, наприклад, об'єктно-орієнтована. На lazarus-ide.org є чудова безкоштовна, крос-платформа, реалізація та IDE. А прямий нащадок Borland досі живе в Дельфах на сайті embarcadero.com/products/delphi, який коштує дуже дорого (imo) за $ 299 для початкового видання і 1 тис. доларів за "зручне" видання. Однак це крос-платформа - windows, iOs, Mac, Android. Отримайте пробне видання або скористайтеся Lazarus і відчуйте себе на 20 років молодше, -)
Мауг каже, що поверніть Моніку

1
@yannis "така шкода, що Паскаль не розвивався" ... окрім "Turbo Pascal" Андерс продовжує розробляти C # ти маєш на увазі?
пристань7

7

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

Статтю про розвиток "де" варто прочитати.


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


6

Жоден з портів Win32 Unix, який я міг знайти в Інтернеті, не є позитивним, тому що всі вони мають один або декілька таких недоліків:

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

Тому я врешті-решт написав своє, що правильно підтверджує все вищезазначене.

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


FYI Я з відкритим джерелом свого згаданого вище інструменту what.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 Мб залежно від варіантів. - Про опис (Brent R. Matzelle)

Знімок екрана зі списком команд, включених у GOW:

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


5

Я створив інструмент, подібний до Ned Batchelder:

Пошук файлів .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
Я вважаю за краще це в декількох рядках, щоб я міг це зрозуміти. ;-)
Gringo Suave

4

Для вас, користувачів Windows XP (у яких немає whereвбудованої команди), я написав команду "де як", як називається рубігем whichr.

Щоб його встановити, встановіть Ruby.

Тоді

gem install whichr

Виконайте це так:

C:> whatr cmd_here


3
Я підозрюю, що вас заперечують, оскільки ви пропонуєте робити що-небудь у Windows XP.
sebastian-c

1
Не вдалося сказати, але встановити Ruby для реалізації тривіальної команди також важко. Зверху є цикл for, який можна помістити в пакетний сценарій.
Gringo Suave

2
Чи друкує він вступні рядки до пісні теми для The Witcher, якщо ви запускаєте її у багатослівному режимі? ;)
Agi Hammerthief

3

TCC і TCC / LE від JPSoft - це заміна CMD.EXE, яка додає значних функціональних можливостей. Відповідно до питання про ОП, 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.