Есть ли эквивалент "which" в командной строке Windows?
Поскольку у меня иногда возникают проблемы с путями, где один из моих собственных скриптов cmd скрыт (затенен) другой программой (ранее на пути), я хотел бы иметь возможность найти полный путь к программе в команде Windows line, учитывая только его название.
Есть ли эквивалент команды UNIX 'which??
В UNIX which command
распечатывает полный путь к данной команде, чтобы легко находить и восстанавливать эти проблемы при затенении.
Ответы
Ответ 1
Windows Server 2003 и более поздние версии (т.е. что-либо после 32-разрядной версии Windows XP) предоставляют программу where.exe
, которая выполняет некоторые из действий which
, хотя она соответствует всем типам файлов, а не только исполняемым командам. (Он не соответствует встроенным командам оболочки, например cd
.) Он даже примет подстановочные знаки, поэтому where nt*
находит все файлы в вашем %PATH%
и текущем каталоге, чьи имена начинаются с nt
.
Попробуйте where /?
для справки.
Обратите внимание, что Windows PowerShell определяет where
как псевдоним для командлета Where-Object
, поэтому, если вы хотите where.exe
, вам нужно для ввода полного имени вместо того, чтобы пропустить расширение .exe
.
Ответ 2
В то время как более поздние версии 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
Он фактически возвращает все возможности, но вы можете легко настроить его для определенных правил поиска.
Ответ 3
В 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
) - что делает его более 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 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
.
Ответ 4
В Windows PowerShell:
set-alias which where.exe
Ответ 5
Если у вас установлен PowerShell (который я рекомендую), вы можете использовать следующую команду в качестве грубого эквивалента (вместо имени исполняемого файла укажите имя исполняемого файла):
($Env:Path).Split(";") | Get-ChildItem -filter programName*
Больше здесь: Мой Манвич! PowerShell который
Ответ 6
В инструментах GnuWin32 есть which
, а также целый ряд других инструментов Unix.
Ответ 7
В Windows CMD which
вызовы where
:
$ where php
C:\Program Files\PHP\php.exe
Ответ 8
Cygwin - это решение. Если вы не возражаете против использования стороннего решения, Cygwin - это то, что вам нужно.
Cygwin предоставляет вам удобство * nix в среде Windows (и вы можете использовать его в командной оболочке Windows или использовать оболочку * nix по вашему выбору). Он дает вам целый набор команд * nix (например, which
) для Windows, и вы можете просто включить этот каталог в свой PATH
.
Ответ 9
В PowerShell это gcm
, который дает форматированную информацию о других командах. Если вы хотите получить только путь к исполняемому файлу, используйте .Source
.
Например: gcm git
или (gcm git).Source
Tidbits:
- Доступно для Windows XP.
- Доступно с версии PowerShell 1.0.
-
gcm
является псевдонимом Get-Command
cmdlet.
- Без каких-либо параметров он перечисляет все доступные команды, предлагаемые оболочкой хоста.
- Вы можете создать пользовательский псевдоним с
Set-Alias which gcm
и использовать его как: (which git).Source
.
- Официальные документы: https://technet.microsoft.com/en-us/library/ee176842.aspx
Ответ 10
Go get unxutils отсюда: http://sourceforge.net/projects/unxutils/
gold на платформах Windows, ставит все полезные утилиты unix на стандартный Windows DOS. Использул его в течение многих лет.
В нем есть "что". Обратите внимание, что он чувствителен к ошибкам.
NB: чтобы установить его, взорвите zip где-нибудь и добавьте...\UnxUtils\usr\local\wbin\в переменную env системы.
Ответ 11
У меня есть функция в моем профиле 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:
Ответ 12
Если вы можете найти бесплатный компилятор 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 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.
Ответ 13
Нет на складе Windows, но он предоставляется Services for Unix и есть несколько простых командных скриптов, плавающих вокруг, которые совершают то же самое, что и это этот.
Ответ 14
Лучшей версией этого, которую я нашел в Windows, является утилита Джозефа Ньюком "whereis", которая доступна (с источником) из его сайта.
Статья о развитии "whereis" стоит прочитать.
Ответ 15
Ни один из Win32-портов Unix, которые я мог найти в Интернете, не является удовлетворительным, потому что у них всех есть один или несколько из этих недостатков:
- Нет поддержки переменной Windows PATHEXT. (Который определяет список расширений, неявно добавляемых к каждой команде перед сканированием пути, и в каком порядке.) (Я использую много сценариев tcl, и ни один из общедоступных средств не может их найти.)
- Отсутствует поддержка кодовых страниц cmd.exe, из-за чего они неправильно отображают пути с символами, отличными от ascii. (Я очень чувствителен к этому, с ç в моем имени :-))
- Отсутствует поддержка отдельных правил поиска в cmd.exe и командной строке PowerShell. (Ни один из общедоступных инструментов не найдет сценарии.ps1 в окне PowerShell, но не в окне cmd!)
Так что в конце концов я написал свой собственный, который правильно поддерживает все вышеперечисленное.
Доступно здесь: http://jf.larvoire.free.fr/progs/which.exe
Ответ 16
Этот командный файл использует обработку переменных 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 /?
за помощью.
Ответ 17
Сначала вы можете установить Git из Downloading Git, а затем открыть Git Bash и набрать:
which app-name
Ответ 18
Я использую GOW (GNU на Windows), который является облегченной версией Cygwin. Вы можете взять его с GitHub здесь.
GOW (GNU в Windows) - это легкая альтернатива Cygwin. Он использует удобный установщик Windows, который устанавливает около 130 чрезвычайно полезных приложений UNIX с открытым исходным кодом, скомпилированных в виде собственных двоичных файлов win32. Он рассчитан на максимально малый размер, около 10 МБ, в отличие от Cygwin, который может работать более 100 МБ в зависимости от параметров. - Описание (Брент Р. Мацель)
Снимок экрана со списком команд, включенных в GOW:
![Enter image description here]()
Ответ 19
Я создал инструмент, похожий на Нед Батчелдер:
Поиск файлов.dll и.exe в PATH
Хотя мой инструмент предназначен главным образом для поиска различных версий DLL, он показывает больше информации (дата, размер, версия), но он не использует PATHEXT (я надеюсь обновить мой инструмент в ближайшее время).
Ответ 20
Для вас, пользователей Windows XP (у которых нет встроенной команды where
), я написал команду "where like" в виде rubygem под названием whichr
.
Чтобы установить его, установите Ruby.
затем
gem install whichr
Запустите это как:
C:> whor cmd_here
Ответ 21
TCC и TCC/LE от JPSoft - это замены CMD.EXE, которые добавляют значительную функциональность. Релевантно к вопросу OP, which
- встроенная команда для командных процессоров семейства TCC.
Ответ 22
Я использовал, which
модуль из НПХ на некоторое время, и она работает очень хорошо: 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
. Это быстрее и работает так, как ожидалось.
Ответ 23
попробуй это
set a=%~$dir:1
If "%for%"=="" (Echo %1 not found) else (echo %1 found at %a%)
Ответ 24
Просто нужно опубликовать этот пакетный файл для 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
, не совсем в одну строку.