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


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

Чи є еквівалент команді UNIX 'which'?

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


1900
2017-11-20 04:19


походження


Foredecker: "який" шукає PATH для виконуваного файлу, який буде запускатися, якщо ви введете команду в командному рядку оболонки. - Greg Hewgill
наприклад, якщо у вас встановлено 5 версій Java, і ви не знаєте, який з них використовується, ви можете ввести "який java", і він дає вам PATH до двійкового - ninesided
@Foreecker, MR каже, що це "де" в Win2k3, але Win2k3 не було частиною питання. Якщо "де" немає в інших версіях Windows, інші відповіді також є правильними. IMNSHO - відповідь, яка працює на всіх версіях Windows, є найкращою. Крім того, інші відповіді не є помилковими, це лише різні способи цього зробити. - paxdiablo
Я знаю, що це питання виникло перед SuperUser, але воно напевно там належить. - palswim
Немає ніякого which команда у стандартному Unix. Утиліта POSIX - це type. Команда C має таку команду, а в деяких системах - як зовнішній виконуваний файл. Наприклад, на Debian Linux which виходить з пакета, який викликається debutils. Це зовнішнє which не "бачить" вбудовані оболонки, псевдоніми або функції. type робить; Башс type має можливість заборонити це і просто виконати пошук шляху. - Kaz


Відповіді:


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

Спробуй where /? для допомоги.

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


2107
2017-11-20 05:52



Ні, тому що grep вивчає зміст свого вкладу, який ви повинні дати явно. котрий і where.exe тільки дивись на імена файлів у наборі каталогів, встановлених у змінних середовища PATH. - Michael Ratanapintha
@ Ajedi32 - Правильно, котрий не в XP. Як я вже сказав, "Windows Server 2003 і пізніше". - Michael Ratanapintha
Працює в Windows 8 - rob
стежте, щоб це не буде працювати в powerhell якщо ви не вкажете where.exe - Jonny Leeds
Пам'ятайте, що where.exe це не оболонка побудована, ви повинні мати %windir%\system32 на тобі %PATH% - що може бути не так, як використання where припускає, що ви можете працювати над проблемами на вашому шляху! - Tomasz Gandor


Хоча пізніші версії 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

Це насправді повертає всі можливості, але ви можете налаштувати його досить легко для конкретних правил пошуку.


257
2017-11-20 05:48



Привіт, я б хотіла, щоб я це дізнався! Надто погано, він не працює з MS-DOS або Win9x (тобто з командою command.com). (Реймонд Чен має більш "складну" версію, яку ви можете перетворити на пакетний файл: blogs.msdn.com/oldnewthing/archive/2005/01/20/357225.aspx ) - Michael Ratanapintha
@ Майкл, якщо ви все ще використовуєте DOS або Win95, пошук шляхів виконання є найменше з ваших проблем :-) - paxdiablo
Windows розпізнає більше ніж .exe як виконуваний файл. Останній раз я кодував a which назад в днях W95 / DOS amdittedly, порядок пошуку був - current dir, потім кожен шлях dir, для cmd.com, потім cmd.exe, а потім cmd.bat Таким чином, навіть cmd.bat в поточному директорії виконується befroe cmd.exe там, де на шляху - Mawg
@mawg, оригінал був для того, де ви знаєте розширення, оскільки він відображає, що під UNIX (де таке розширення додавання хитрих не відбувається). Я вже додав той, який може робити те, що хочеш, але це вже не просто команда, скільки скрипт. Вона спочатку намагається неприєднання команди, а потім кожного розширення. Надія, що допомагає. Ви можете налаштувати його відповідно до ваших потреб, як вам здається (якщо ви хочете, щоб такий же порядок пошуку, як у Windows, наприклад, це показує всі можливості). - paxdiablo
Щоб перетворити це в пакетний сценарій, створіть файл з назвою "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 - Brad T.


Під 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's type -a foo), що робить його кращим, ніж інші інструменти where.exe, which.exeі т. д., які не знають про ці команди PowerShell.

Ви можете швидко налаштувати псевдонім sal which gcm (коротка форма set-alias which get-command)


105
2017-11-26 02:07





У Windows PowerShell:

set-alias which where.exe

39
2017-11-30 23:00





Якщо ви встановили PowerShell (який я рекомендую), ви можете використовувати наступну команду як приблизний еквівалент (ім'я програми програми substitue для назви вашого виконуваного файлу):

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

Більше тут: http://www.codeassassin.com/blog/PermaLink,guid,fd1967d1-f844-4e29-82e2-f2d6424b4ef9.aspx


37
2017-11-20 05:16



Я шукав цю точну властивість команди powerhell. Я використовував файл where.exe, але, маючи сум'яття з кодом помилки на вершині розбору свого виводу значно поступається рідному рішенням powerhell. Дякую! - scobi
Якщо у вас є PowerShell, ви повинні використовувати Get-Command. - jpmc26
Але ($Env:Path).Split(";") | Get-ChildItem -filter programName* так легко вводити ... ;-) - Craig
Зниження на користь Get-Command (вибачте @RexE) - piers7
Це також не вдається, якщо у вас є змінна на вашому шляху, яка зазвичай вирішена системою (aka% JAVA_HOME%). - dragon788


The GnuWin32 інструменти є which, а також цілий набір інших інструментів Unix.


31
2017-11-20 06:44



Використовуйте це для завантаження sourceforge.net/projects/getgnuwin32/?source=dlp - Kalpesh Soni


У Windows CMD which дзвінки where:

$ where php
C:\Program Files\PHP\php.exe

19
2018-04-01 12:02





Здивований, що ніхто не згадав cygwin як рішення ще. Якщо ви не заперечуєте про використання стороннього рішення, тоді cygwin це шлях.

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


15
2017-10-12 17:02



GnuWin32, згаданий раніше Ferruccio, набагато краще в цьому випадку, оскільки ви можете мати рідний де виконуваний файл самостійно - Piotr Dobrogost
GnuWin32 чудово, і я використовую його, але якщо ви хочете цю функцію без встановлення інструментів GnuWin32, де .exe виглядає як правильний дзвінок. Хоча, я поставляю інструменти GnuWin32 в \ bin $ частку в нашій мережі, щоб я міг використовувати їх з робочих станцій (і в пакетних файлах), які не мають їх локально встановити. - Craig
Коли ми говоримо про використання Cygwin у Windows, я віддаю перевагу: cygpath -w "", який <appname> ` - mpasko256