Pytanie Czy istnieje odpowiednik "co" w wierszu poleceń systemu Windows?


Ponieważ czasami mam problemy ze ścieżką, gdzie jeden z moich własnych skryptów cmd jest ukryty (shadowed) przez inny program (wcześniej na ścieżce), chciałbym móc znaleźć pełną ścieżkę do programu w wierszu poleceń systemu Windows, biorąc pod uwagę tylko jego nazwa.

Czy istnieje odpowiednik polecenia systemu UNIX "co"?

W systemie UNIX which command wypisuje pełną ścieżkę podanego polecenia, aby łatwo znaleźć i naprawić te problemy z cieniem.


1900
2017-11-20 04:19


pochodzenie


Foredecker: "which" przeszukuje PATH dla pliku wykonywalnego, który zostanie uruchomiony po wpisaniu polecenia w wierszu powłoki. - Greg Hewgill
na przykład, jeśli masz zainstalowanych 5 wersji Java i nie wiesz, który z nich jest używany, możesz wpisać "which java" i daje on PATH do binarnego - ninesided
@Foredecker, MR mówi, że jest "gdzie" w Win2k3, ale Win2k3 nie było częścią tego pytania. Jeśli "gdzie" nie występuje w innych wersjach systemu Windows, inne odpowiedzi również są prawidłowe. IMNSHO, odpowiedź, która działa na wszystkich wersjach systemu Windows, jest najlepsza. Także inne odpowiedzi nie są błędne, tylko różne sposoby robienia tego. - paxdiablo
Wiem, że to pytanie powstało przed SuperUser, ale prawdopodobnie należy tam. - palswim
Nie ma which polecenie w standardowym systemie Unix. Narzędzie POSIX to type. Powłoka C ma polecenie, a niektóre systemy mają go jako zewnętrzny plik wykonywalny. Na przykład w systemie Debian Linux, which pochodzi z pakietu o nazwie debutils. To zewnętrzne which nie "widzi" wbudowanych powłok, aliasów ani funkcji. type robi; Bash's type ma opcję, aby to powstrzymać i po prostu wykonać wyszukiwanie ścieżki. - Kaz


Odpowiedzi:


Windows Server 2003 i późniejsze (tj. Wszystko po 32-bitowym Windows XP) zapewniają where.exe program, który robi co nieco which robi, mimo że pasuje do wszystkich typów plików, a nie tylko wykonywalnych poleceń. (Nie pasuje do wbudowanych poleceń powłoki, takich jak cd) Będzie nawet akceptował symbole wieloznaczne, więc where nt* znajduje wszystkie pliki w twoim %PATH% i bieżący katalog, którego nazwy zaczynają się od nt.

Próbować where /? o pomoc.

Zauważ, że Windows PowerShell definiuje where jako alias dla Where-Object cmdlet, więc jeśli chcesz where.exe, musisz wpisać pełną nazwę zamiast pomijać .exe rozbudowa.


2107
2017-11-20 05:52



Nie poniewaź grep analizuje zawartość jego danych wejściowych, które należy wyraźnie podać. który i where.exe tylko patrzeć na nazwy plików w zestawie katalogów ustawionych w zmiennych środowiskowych PATH. - Michael Ratanapintha
@ Ajedi32 - Prawidłowo, który nie jest w XP. Jak już powiedziałem, "Windows Server 2003 i nowsze". - Michael Ratanapintha
Działa w Windows 8 - rob
uważaj na to nie będę pracował w powershell chyba że wpiszesz where.exe - Jonny Leeds
Zapamietaj to where.exe nie jest wbudowaną powłoką, musisz mieć %windir%\system32 na Twoim %PATH% - co może nie być takie, jak użycie where sugeruje, że możesz pracować nad problemami związanymi z Twoją ścieżką! - Tomasz Gandor


Podczas gdy nowsze wersje systemu Windows mają where można to zrobić w systemie Windows XP za pomocą modyfikatorów zmiennych środowiskowych:

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

Nie potrzebujesz żadnych dodatkowych narzędzi i nie jest do tego ograniczony PATH ponieważ możesz zastąpić każdą zmienną środowiskową (oczywiście w formacie ścieżki), której chcesz użyć.


A jeśli chcesz taki, który poradzi sobie z wszystkimi rozszerzeniami w PATHEXT (tak jak robi to sam Windows), to robi to:

@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

W rzeczywistości zwraca wszystkie możliwości, ale można je łatwo dostosować do określonych reguł wyszukiwania.


257
2017-11-20 05:48



Hej, szkoda, że ​​tego się nie nauczyłem! Szkoda, że ​​nie działa z MS-DOS lub Win9x (czyli z command.com). (Raymond Chen ma bardziej "skomplikowaną" wersję, którą możesz zamienić w plik wsadowy: blogs.msdn.com/oldnewthing/archive/2005/01/20/357225.aspx ) - Michael Ratanapintha
@Michael, jeśli nadal używasz DOS lub Win95, znalezienie plików wykonywalnych na ścieżce to najmniej twoich problemów :-) - paxdiablo
Windows rozpoznaje więcej niż .exe jako plik wykonywalny. Ostatnim razem zakodowałem a which z powrotem w W95 / DOS niepotrzebnie, porządek wyszukiwania był - aktualny katalog, potem każdy katalog ścieżki, dla cmd.com, potem cmd.exe, potem cmd.bat Tak, nawet cmd.bat w bieżącym katalogu jest wykonywany befroe cmd.exe miejsce na ścieżce - Mawg
@mawg, oryginał był tam, gdzie znasz rozszerzenie, ponieważ odzwierciedla ono pod UNIX (tam, gdzie nie występuje sztuczka dodająca rozszerzenia). Dodałem teraz jedną, która może zrobić, co chcesz, ale nie jest to już zwykła komenda tak bardzo jak skrypt. Najpierw próbuje niezniszczonej komendy, a następnie każdej z rozszerzających. Nadzieja, która pomaga. Możesz dostosować go do swoich potrzeb według własnego uznania (jeśli chcesz mieć taką samą kolejność wyszukiwania jak na przykład w systemie Windows - ta pokazuje wszystkie możliwości). - paxdiablo
Aby przekształcić to w skrypt wsadowy, utwórz plik o nazwie "which.bat": @echo off for %%i in (%1) do @echo. %%~$PATH:%i  Aby dodać go do skryptu alias.bat, który ładujesz za każdym razem, gdy uruchamiasz program cmd.exe (umieść powyższy skrypt w nowym katalogu o nazwie C: \ usr \ aliases): DOSKEY which=C:\usr\aliases\which.bat $*  Następnie możesz utworzyć skrypt uruchamiający plik cmd.exe z plikiem alias.bat: cmd.exe /K E:\usr\aliases\alias.bat - Brad T.


W PowerShell get-command znajdzie pliki wykonywalne w dowolnym miejscu $Env:PATH.

get-command eventvwr

CommandType   Name          Definition
-----------   ----          ----------
Application   eventvwr.exe  c:\windows\system32\eventvwr.exe
Application   eventvwr.msc  c:\windows\system32\eventvwr.msc

Znajduje także polecenia cmdlet powershell, funkcje, aliasy, pliki z niestandardowymi rozszerzeniami plików wykonywalnych $Env:PATHEXT, itp. zdefiniowane dla bieżącej powłoki (całkiem podobne do basha type -a foo) - sprawia, że ​​jest to lepsze podejście niż inne narzędzia, takie jak where.exe, which.exeitp., które nie są świadome tych poleceń PowerShell.

Możesz szybko ustawić alias przy pomocy sal which gcm (krótka forma set-alias which get-command).


105
2017-11-26 02:07





W oknie powershell:

set-alias which where.exe

39
2017-11-30 23:00





Jeśli masz zainstalowany PowerShell (który polecam), możesz użyć poniższego polecenia jako przybliżonego odpowiednika (pod nazwą programitname dla twojej nazwy pliku wykonywalnego):

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

Więcej tutaj: http://www.codeassassin.com/blog/PermaLink,guid,fd1967d1-f844-4e29-82e2-f2d6424b4ef9.aspx


37
2017-11-20 05:16



Szukałem tego precyzyjnego polecenia powerhell. Używałem where.exe, ale posiadanie bałaganu z kodem błędu na górze parsowania jego wyników jest znacznie gorsze od natywnego rozwiązania Power Shell. Dzięki! - scobi
Jeśli masz PowerShell, powinieneś używać Get-Command. - jpmc26
Ale ($Env:Path).Split(";") | Get-ChildItem -filter programName* tak łatwo wpisać ... ;-) - Craig
Obalenie na korzyść Get-Command (przepraszam @ RexE) - piers7
To również nie powiedzie się, jeśli na ścieżce znajduje się zmienna, która jest normalnie rozwiązywana przez system (np.% JAVA_HOME%). - dragon788


The GnuWin32 narzędzia mają whichwraz z całym mnóstwem innych narzędzi Unix.


31
2017-11-20 06:44



Skorzystaj z tego, aby pobrać sourceforge.net/projects/getgnuwin32/?source=dlp - Kalpesh Soni


W Windows CMD which połączenia where:

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

19
2018-04-01 12:02





Zaskoczony, że nikt o tym nie wspomniał Cygwin jako jeszcze rozwiązanie. Jeśli nie masz nic przeciwko korzystaniu z rozwiązań innych firm, to cygwin jest drogą do zrobienia.

Cygwin daje Ci komfort * nix w środowisku Windows (możesz go użyć w powłoce poleceń Windows lub użyć powłoki * nix do wyboru). Daje ci cały szereg poleceń * nix (np which) dla Windows, i możesz po prostu włączyć ten katalog do swojego PATH.


15
2017-10-12 17:02



GnuWin32 wspomniany wcześniej przez Ferruccio jest znacznie lepszy w tym przypadku, ponieważ możesz mieć natywną gdzie plik wykonywalny sam. - Piotr Dobrogost
GnuWin32 jest świetny i używam go, ale jeśli chcesz tę funkcjonalność bez instalowania narzędzi GnuWin32 where.exe wydaje się być właściwym połączeniem. Mimo to umieszczam narzędzia GnuWin32 w udziale \ bin $ w naszej sieci, aby można było używać ich ze stacji roboczych (oraz plików wsadowych), które nie mają ich zainstalowanych lokalnie. - Craig
Kiedy mówimy o używaniu Cygwin w Windows, wolę: cygpath -w "` który <appname> `" - mpasko256


W PowerShell jest gcm, która daje sformatowaną informację o innych poleceniach. Jeśli chcesz pobrać tylko ścieżkę do pliku wykonywalnego, użyj .Source.

Na przykład: gcm git lub (gcm git).Source

Tidbits:

  • Dostępne dla systemu Windows XP.
  • Dostępne od PowerShell 1.0.
  • gcm jest aliasem Get-Command cmdlet.
  • Bez parametrów wyświetla listę wszystkich dostępnych poleceń oferowanych przez powłokę hosta.
  • Możesz utworzyć niestandardowy alias za pomocą Set-Alias which gcm i użyj go jak: (which git).Source.
  • Oficjalne dokumenty: https://technet.microsoft.com/en-us/library/ee176842.aspx

11
2017-09-11 11:32





Idź get unxutils stąd: http://sourceforge.net/projects/unxutils/

złoto na platformach Windows, umieszcza wszystkie ładne narzędzia unix na standardowym systemie Windows DOS. Używam go od lat.

Ma "które" zawarte. Zwróć uwagę, że wielkość liter ma znaczenie.

NB: aby zainstalować, należy gdzieś eksplodować zip i dodać ... \ UnxUtils \ usr \ local \ wbin \ do zmiennej systemowej env.


8
2018-03-26 00:08



nie jest rozróżniana wielkość liter, również muszę powiedzieć, który java.exe zamiast którego java - windows 7 - Kalpesh Soni
Ma kilka frustracji związanych z nowymi liniami; grep na przykład nie będzie pasowało do EOL bez włożenia a . dla \ r. Z pewnością jest to 99% rozwiązanie! - dash-tom-bang


Mam funkcję w moim profilu PowerShell o nazwie "co"

function which {
    get-command $args[0]| format-list
}

Oto, jak wyglądają dane wyjściowe:

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:

7
2017-07-31 08:59



Żadne inne rozwiązanie nie działało dla mnie, ale > get-command app.exe | format-list działało idealnie! - Alexander McFarlane