Поскольку у меня иногда возникают проблемы с путями, когда один из моих собственных сценариев cmd скрыт (затенен) другой программой (ранее на пути), я хотел бы иметь возможность найти полный путь к программе в командной строке Windows, учитывая просто его название.
Есть ли эквивалент UNIX-команде 'which'?
В UNIX which command печатает полный путь к данной команде, чтобы легко найти и исправить эти проблемы с теневым копированием.
Foredecker: "which" выполняет поиск в PATH исполняемого файла, который будет запущен, если вы введете команду в приглашении оболочки.
например, если у вас установлено 5 версий Java, и вы не знаете, какая из них используется, вы можете ввести «which java» и получить ПУТЬ к двоичному файлу.
@Foredecker, MR говорит, что это «где» в Win2k3, но Win2k3 не является частью вопроса. Если «где» нет в других версиях Windows, другие ответы также действительны. IMNSHO, лучший ответ, который работает во всех версиях Windows. Кроме того, другие ответы не ошибочны, просто разные способы сделать это.
Я знаю, что этот вопрос возник перед SuperUser, но он, вероятно, принадлежит ему.
Этот вопрос был задан в других потоках: [Эквивалент команды * Nix 'which' в Powershell?] [1] [Powershell, эквивалент команды unix which?] [2] [1]: stackoverflow.com/questions/63805/… [2]: superuser.com/questions/34492/…
Мне очень пригодился этот командный файл pankaj-k.net/weblog/2004/11/equivalent_of_which_in_windows.h tml
Вы можете получить командный файл размером всего 90 байт отсюда: blogs.msdn.com/b/oldnewthing/archive/2005/01/20/357225.aspx Или запустить программу C# - ссылка размещена на веб-сайте выше.
В стандартном Unix нет команды which. Утилита POSIX - type. В оболочке C есть команда which, а в некоторых системах она используется как внешний исполняемый файл. Например, в Debian Linux which поступает из пакета под названием debutils. Этот внешний which не «видит» встроенные оболочки, псевдонимы или функции. type делает; type Bash имеет возможность подавить это и просто выполнить поиск пути.
Чтобы проиллюстрировать точку зрения @kaz, сравните выходы which -a pwd и type -a pwd.





Нет в стандартной Windows, но он предоставляется Сервисы для Unix, и есть несколько простых пакетных сценариев, которые выполняют то же самое, например этот Вот этот.
За исключением того, что команда, которую вы связываете, выводит только переменную PATH и даже не проверяет, найден ли там файл.
Лучшая версия этого, которую я нашел в Windows, - это утилита "whereis" Джозефа Новичка, которая доступна (с исходным кодом) на сайте его сайт.
Стоит прочитать статью о разработке «whereis».
Поздний комментарий: где есть проблемы с поиском 64-битных исполняемых файлов под Win 7 64-бит.
Если у вас установлен PowerShell (что я рекомендую), вы можете использовать следующую команду в качестве приблизительного эквивалента (замените programName на имя исполняемого файла):
($Env:Path).Split(";") | Get-ChildItem -filter programName*
Больше здесь: Мой Мэнвич! PowerShell Какой
Я искал именно эту лаконичную команду PowerShell. Я использовал where.exe, но необходимость возиться с кодом ошибки поверх синтаксического анализа его вывода намного уступает нативному решению PowerShell. Спасибо!
Но ($Env:Path).Split(";") | Get-ChildItem -filter programName* так легко набирать ... ;-)
Это также не работает, если в вашем пути есть переменная, которая обычно разрешается системой (также известная как% JAVA_HOME%).
Я не могу заставить which.exe работать, я пробовал это, и это сработало.
Ответом gcm было бы гораздо лучше использовать PowerShell сегодня: stackoverflow.com/a/27140194/5340149
Хотя в более поздних версиях 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, если вы все еще используете DOS или Win95, поиск исполняемых файлов на пути - это наименее ваших проблем :-)
Windows распознает больше, чем .exe, как исполняемый файл. В прошлый раз, когда я кодировал which еще в дни W95 / DOS, порядок поиска был - текущий каталог, затем каждый каталог пути, для cmd.com, затем cmd.exe, затем cmd.bat Итак, даже cmd.bat в текущем каталоге выполняется befroe cmd.exe где-нибудь в пути
@mawg, оригинал был для того места, где вы знаете расширение, поскольку он отражает его в UNIX (где этот обман с добавлением расширений не происходит). Теперь я добавил одну, которая может делать то, что вы хотите, но это уже не простая команда, а скорее скрипт. Сначала он пробует неукрашенную команду, а затем каждую из дополнительных. Надеюсь, это поможет. Вы можете настроить его по своему усмотрению (например, если вам нужен такой же порядок поиска, как в Windows - здесь показаны все возможности).
Чтобы превратить это в пакетный сценарий, создайте файл с именем "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
Стоит отметить, что на примере for %i in (_____) do @echo. %~$PATH:i найдется любое расширение, а не только exe. Он работает для файла a.a или youtube-dl.py, если он находится в пути. Но это забавно, если вы помещаете туда каталог, он выводит его, даже если он не находится в пути, например. for %i in (%TEMP%) do @echo. %~$PATH:i
Спасибо, я работаю над Windows 7 без команды where, и это делает работу
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.
@ Ajedi32 - Верно, который отсутствует в XP. Как я уже сказал, «Windows Server 2003 и новее».
@MichaelRatanapintha Да, почему-то я подумал, что Windows Server 2003 была создана до Windows XP. Чувак, XP старый ...
следите за тем, чтобы этот не будет работать в PowerShell, если вы не наберете where.exe
Предупреждение: "where" не будет работать с цитируемыми путями, убедитесь, что ваш% path% не содержит их.
Помните, что where.exe не является встроенной оболочкой, вам необходимо иметь %windir%\system32 на вашем %PATH% - что может быть не так, поскольку использование where предполагает, что вы можете работать над проблемами с вашим путем!
Не работал в CMD на сервере 2016 без ввода where.exe
Powershell Get-Command или gcm, как упоминалось в другом ответе, эквивалентен where
Также работает в Windows 10.
Чтобы быть явным: 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
Действительно ли where действителен вне выражения select? В противном случае я бы счел это ошибкой, поскольку из контекста должно быть очевидно, что where.exe предназначен, когда это первое, что вводится в командной строке.
Сделал еще один шаг и сделал функцию поиска по пути и программным файлам / окнам и т. д. Может легко использоваться в качестве адаптера. См. stackoverflow.com/a/63257980/5079799
re: where.exe may return multiple values Но НЕ обязательно в порядке каталогов в вашей переменной среды echo %PATH%. В Windows есть как переменная PATH пользовательского уровня, так и переменная PATH системного уровня. echo %PATH% отображает системную переменную, но which.exe сначала использует переменную уровня пользователя. Сюрприз!
У инструментов 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
У него есть несколько разочарований, хотя он связан с новыми строками; Например, grep не будет соответствовать EOL, если вы не добавите . для \ r. Хотя это точно решение на 99%!
Да, регистр не учитывается, однако по умолчанию имена файлов в Windows также не чувствительны к регистру.
Если вы можете найти бесплатный компилятор 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.
Вау, есть люди, которые все еще используют Паскаль? :-)
Я полагаю, что есть. Но не я. Вы видели строку program_date = '17 March 1994 ';
Блок my_funk; не нужен. Спасибо за размещение программы на Паскале, напоминает мне о моей юности! Очень жаль, что Паскаль не эволюционировал.
О, но это было так. Например, теперь он объектно-ориентированный. В lazarus-ide.org есть отличная бесплатная кроссплатформенная реализация и IDE. И прямой потомок Borland все еще живет в Delphi в embarcadero.com/products/delphi, что очень дорого (imo) - 299 долларов за стартовую версию и 1 тысячу долларов за «полезную» версию. Однако он кроссплатформенный - windows, iOs, Mac, Android. Получите пробную версию или воспользуйтесь Lazarus и почувствуйте себя на 20 лет моложе, -)
@yannis "как жаль, что Паскаль не эволюционировал" ... Вы имеете в виду, не считая "Turbo Pascal" Андерс, который занимается разработкой C#?
Или Дельфи, или Лазарь? Такая мелочь, как объектная ориентация, не считается эволюцией?
@Mawg Delphi был правильным выбором. После версии 6 и когда все ребята из Borland ушли в Microsoft, это оттолкнуло многих, включая меня.
И теперь он стоит минимум 1 тыс. Долларов (!), Если вы не купите стартовую версию за 299 долларов, которая очень ограничена (последняя купленная мной стартовая версия не имела генерации 64-битного кода и, что еще хуже для меня, доступа к базе данных). Lazarus великолепен, но главный плюс Delphi - это тысячи (бесплатных) компонентов VCL.
На данный момент (начало 2018 г.) они, должно быть, осознали, что теряют обычай, и стартовая версия теперь бесплатен (пока вы не заработаете на нем 1 тыс. Долларов США). Это всего лишь 32 бита, но есть бесплатные решения для ограничения. Либо так, либо Лазарь хорошо выглядишь
И теперь, в декабре 2020 года, у него есть общественное издание - ностальгируйте по себе.
Cygwin - это решение. Если вы не против использования стороннего решения, то Cygwin - ваш выбор.
Cygwin дает вам комфорт * nix в среде Windows (и вы можете использовать его в своей командной оболочке Windows или использовать оболочку * nix по вашему выбору). Он предоставляет вам целый ряд команд * nix (например, which) для Windows, и вы можете просто включить этот каталог в свой PATH.
GnuWin32, упомянутый ранее Ферруччо, намного лучше в этом случае, поскольку у вас может быть только собственный исполняемый файл где.
GnuWin32 великолепен, и я использую его, но если вам нужна эта функциональность без установки инструментов GnuWin32, то вариант where.exe кажется правильным решением. Хотя я помещаю инструменты GnuWin32 в общий ресурс \ bin $ в нашей сети, чтобы я мог использовать их с рабочих станций (и в пакетных файлах), на которых они не установлены локально.
Когда мы говорим об использовании Cygwin в Windows, я предпочитаю: cygpath -w "` which <appname> `"
В 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.
Он находит гораздо больше, чем просто исполняемые файлы. Он также ловит командные файлы
@ 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/…
Честно говоря, этот ответ должен быть выбран как лучший ответ сейчас, когда наступил 2020 год, поскольку исходный ответ был опубликован еще в 2008 году. Времена изменились. PowerShell - это способ, особенно потому, что этот ответ теперь кроссплатформенный для всех, где существует PowerShell.
Ни один из Win32-портов Unix, которые я смог найти в Интернете, не является удовлетворительным, потому что все они имеют один или несколько из следующих недостатков:
В конце концов, я написал свой собственный, который правильно поддерживает все вышеперечисленное.
Доступно там: http://jf.larvoire.free.fr/progs/which.exe
К вашему сведению, я открыл исходный код моего инструмента which.exe, упомянутого выше, и многих других на github.com/JFLarvoire/SysToolsLib. Здесь вы можете получить последнюю версию, сообщить о проблемах и т. д.
У меня есть функция в моем профиле 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 работал отлично!
Для вас, пользователей Windows XP (у которых нет встроенной команды where), я написал команду «where like» в виде rubygem под названием whichr.
Чтобы установить его, установите Ruby.
Затем
gem install whichr
Запустите это так:
C:> какой cmd_here
Я подозреваю, что вас отвергают, потому что вы предлагаете что-либо делать в Windows XP.
Я не голосовал против, но установить Ruby для реализации тривиальной команды тоже сложно. Выше есть цикл for, который можно поместить в пакетный скрипт.
Печатает ли он вводные строки музыкальной темы для Ведьмак, если вы запускаете его в подробном режиме? ;)
В PowerShell это gcm, который предоставляет отформатированную информацию о других командах. Если вы хотите получить только путь к исполняемому файлу, используйте .Source.
Например: gcm git или (gcm git).Source.
Интересные факты:
gcm - это псевдоним Командлет Get-Command.Set-Alias which gcm и использовать его как: (which git).Source.В Windows CMD which вызывает where:
$ where php
C:\Program Files\PHP\php.exe
Где будут перечислены все доступные ресурсы. Что касается меня, я использовал where pip и получил три результата. Я не уверен, какой из них исполнен.
Этот пакетный файл использует обработку переменных 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:
Я довольно давно использую модуль 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.
Я предпочел бы это в нескольких строках, чтобы я мог это понять. ;-)
Все команды 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 . . .
Что делает "which" в Unix?