Czy w wierszu poleceń systemu Windows istnieje odpowiednik „które”?

2350

Ponieważ czasami mam problemy ze ścieżką, gdzie jeden z moich własnych skryptów cmd jest ukryty (zacieniony) 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 UNIX „który”?

W systemie UNIX which commanddrukuje pełną ścieżkę danego polecenia, aby łatwo znaleźć i naprawić problemy z zacieniowaniem.

namin
źródło
3
Foredecker: „który” szuka ŚCIEŻKI pliku wykonywalnego, który zostanie uruchomiony, jeśli wpiszesz polecenie w wierszu polecenia powłoki.
Greg Hewgill,
3
na przykład, jeśli masz zainstalowanych 5 wersji Javy i nie wiesz, która z nich jest używana, możesz wpisać „which java”, a ona poda
ŚCIEŻKĘ do pliku
9
@Foredecker, MR mówi, że to „gdzie” w Win2k3, ale Win2k3 nie było częścią pytania. Jeśli „gdzie” nie występuje w innych wersjach systemu Windows, inne odpowiedzi są również poprawne. IMNSHO, odpowiedź, która działa na wszystkich wersjach systemu Windows jest najlepsza. Ponadto inne odpowiedzi nie są błędne, po prostu różne sposoby na zrobienie tego.
paxdiablo
36
Wiem, że to pytanie powstało przed SuperUser, ale prawdopodobnie tam należy.
palswim
16
W whichstandardowym Uniksie nie ma polecenia. Narzędzie POSIX to type. Powłoka C ma komendę what, a niektóre systemy mają ją jako zewnętrzny plik wykonywalny. Na przykład w systemie Debian Linux whichpochodzi z pakietu o nazwie debutils. To zewnętrzne whichnie „widzi” wbudowanych powłok, aliasów ani funkcji powłoki. typerobi; Bash typema opcję, aby to ukryć i po prostu wyszukać ścieżkę.
Kaz

Odpowiedzi:

2549

Windows Server 2003 i nowsze wersje (tj. Cokolwiek po 32-bitowym systemie Windows XP) zapewniają where.exeprogram, który wykonuje niektóre czynności which, chociaż pasuje do wszystkich typów plików, a nie tylko poleceń wykonywalnych. (Nie pasuje do wbudowanych poleceń powłoki, takich jak cd.) Przyjmie nawet symbole wieloznaczne, więc where nt*znajdzie wszystkie pliki w twoim %PATH%i bieżącym katalogu, których nazwy zaczynają się nt.

Spróbuj where /?uzyskać pomoc.

Zauważ, że Windows PowerShell definiuje się wherejako alias polecenia Where-Objectcmdlet , więc jeśli chcesz where.exe, musisz wpisać pełną nazwę zamiast pomijać .exerozszerzenie.

Michael Ratanapintha
źródło
30
Nie, ponieważ grep sprawdza zawartość swoich danych wejściowych, które musisz wyraźnie podać. które i where.exe sprawdzają tylko nazwy plików w zestawie katalogów ustawionych w zmiennych środowiskowych PATH.
Michael Ratanapintha,
12
@ Ajedi32 - poprawna, która nie jest w XP. Jak powiedziałem: „Windows Server 2003 i nowsze wersje”.
Michael Ratanapintha,
24
Działa w systemie Windows 8
okradać
57
uważaj, że to nie zadziała w PowerShell, chyba że wpiszesz where.exe
JonnyRaa
17
Pamiętaj, że where.exenie jest wbudowane powłoki, trzeba mieć %windir%\system32na własną %PATH%- co nie może być przypadek, jak użycie wheresugeruje, że można pracować na problemy ze swojej drodze!
Tomasz Gandor
288

Podczas gdy nowsze wersje systemu Windows mają wherepolecenie, możesz to również zrobić w systemie Windows XP, używając modyfikatorów zmiennych środowiskowych w następujący sposób:

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 to ograniczone, PATHponieważ możesz zastąpić dowolną zmienną środowiskową (oczywiście w formacie ścieżki), której chcesz użyć.


A jeśli chcesz taki, który może obsłużyć wszystkie rozszerzenia PATHEXT (podobnie jak sam system Windows), ten rozwiązuje problem:

@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 dość łatwo dostosować do określonych reguł wyszukiwania.

paxdiablo
źródło
7
Hej, chciałbym się tego nauczyć! Szkoda, że ​​nie działa z MS-DOS lub Win9x (to znaczy z Command.com). (Raymond Chen ma bardziej „rozbudowaną” wersję, którą można przekształcić w plik wsadowy: blogs.msdn.com/oldnewthing/archive/2005/01/20/357225.aspx )
Michael Ratanapintha
110
@Michael, jeśli nadal używasz DOS lub Win95, znalezienie plików wykonywalnych na ścieżce to najmniejszy z twoich problemów :-)
paxdiablo
Windows rozpoznaje więcej niż .exe jako plik wykonywalny. Ostatnim razem, gdy kodowałem z whichpowrotem w dniach W95 / DOS, zgodnie z kolejnością wyszukiwania - bieżący katalog, następnie każdy katalog ścieżki dla cmd.com, następnie cmd.exe, a następnie cmd.bat Tak więc nawet cmd.bat w bieżącym katalogu jest wykonał befroe cmd.exe soemwhere in path
Mawg mówi przywrócić Monikę
3
@mawg, oryginał był tam, gdzie znasz rozszerzenie, ponieważ odzwierciedla ono to, które w systemie UNIX (gdzie ta sztuczka polegająca na dodawaniu rozszerzeń nie występuje). Dodałem teraz taki, który może robić, co chcesz, ale nie jest to już zwykłe polecenie, a jedynie skrypt. Najpierw próbuje wykonać nieadekwatną komendę, a następnie każdą z rozszerzeń. Mam nadzieję, że to 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
2
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 przy każdym uruchomieniu 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, aby uruchomić cmd.exe z plikiem alias.bat: cmd.exe /K E:\usr\aliases\alias.bat
Brad T.
151

W PowerShell Get-Commandznajdziesz 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

Stwierdza ponadto cmdlets PowerShell, funkcje, aliasy, plików z niestandardowych wykonywalne rozszerzeniami pośrednictwem $Env:PATHEXTitp zdefiniowanych dla bieżącej powłoki (bardzo podobny do atakujących użytkownika type -a foo) - dzięki czemu jest lepiej iść do niż inne narzędzia, takie jak where.exe, which.exeitp, które nie są świadomi tych Polecenia PowerShell.

Znajdowanie plików wykonywalnych przy użyciu tylko części nazwy

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
...

Znajdowanie niestandardowych plików wykonywalnych

Aby znaleźć inne pliki wykonywalne inne niż Windows (python, ruby, perl itp.), Rozszerzenia plików tych plików wykonywalnych należy dodać do PATHEXTzmiennej środowiskowej (domyślnie .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL), aby zidentyfikować pliki z tymi rozszerzeniami PATHjako pliki wykonywalne. Ponieważ Get-Commandrównież honoruje tę zmienną, można ją rozszerzyć o listę niestandardowych plików wykonywalnych. na przykład

$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

Możesz szybko skonfigurować alias za pomocą sal which gcm(krótka forma set-alias which get-command).

Więcej informacji i przykładów można znaleźć w pomocy online dla Get-Command.

shalomb
źródło
2
Znajduje znacznie więcej niż tylko pliki wykonywalne.
Łapie
2
@ TheIncorriable1 - jeśli masz na myśli pliki poleceń, takie jak pliki wsadowe ( .BAT, .CMDitp.), Są one uważane za wykonywalne, ponieważ ich rozszerzenia są nazwane w PATHEXTzmiennej (która domyślnie jest PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL). Inne rodzaje wykonywalne (na przykład .py, .rbitd) mogą być dodawane przez dodanie rozszerzenie i utworzenia powiązania wykonywalny assoc/ ftype- np docs.python.org/3.3/using/...
shalomb
59

W Windows PowerShell:

set-alias which where.exe
cmcginty
źródło
40

Jeśli masz zainstalowany program PowerShell (który polecam), możesz użyć następującego polecenia jako przybliżonego odpowiednika (zamień nazwę programu na nazwę pliku wykonywalnego):

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

Więcej jest tutaj: My Manwich! PowerShell Które

RexE
źródło
1
Szukałem tej dokładnej komendy PowerShell. Używałem where.exe, ale konieczność manipulowania kodem błędu podczas analizowania jego wyników jest znacznie gorsza od natywnego rozwiązania PowerShell. Dzięki!
scobi
9
Ale ($Env:Path).Split(";") | Get-ChildItem -filter programName*tak łatwo jest pisać ... ;-)
Craig
To również kończy się niepowodzeniem, jeśli na ścieżce znajduje się zmienna, która jest normalnie rozwiązywana przez system (alias% JAVA_HOME%).
dragon788
Nie mogę uzyskać programu.exe, który zadziałał. Próbowałem tego i działało.
Asfand Qazi
37

W GnuWin32 narzędzia mają which, wraz z całym zabił innych narzędzi Unix.

Ferruccio
źródło
24

W whichpołączeniach CMD systemu Windows where:

$ where php
C:\Program Files\PHP\php.exe
automatix
źródło
17

Cygwin to rozwiązanie. Jeśli nie masz nic przeciwko korzystaniu z rozwiązań innych firm, to Cygwin jest najlepszym rozwiązaniem.

Cygwin zapewnia komfort * nix w środowisku Windows (i możesz go użyć w powłoce poleceń systemu Windows lub użyć wybranej powłoki * nix). Daje ci całą masę poleceń * nix (jak which) dla systemu Windows, i możesz po prostu dołączyć ten katalog do swojego PATH.

palswim
źródło
10
GnuWin32 wspomniany wcześniej przez Ferruccio jest w tym przypadku znacznie lepszy, ponieważ możesz mieć natywną, gdzie jest wykonywalna sama.
Piotr Dobrogost
GnuWin32 jest świetny i używam go, ale jeśli chcesz tę funkcjonalność bez instalowania narzędzi GnuWin32, gdzie.exe wydaje się właściwym wywołaniem. Chociaż umieszczam narzędzia GnuWin32 w udziale \ bin $ w naszej sieci, aby móc korzystać z nich ze stacji roboczych (i plików wsadowych), które nie mają ich zainstalowanych lokalnie.
Craig
1
Kiedy mówimy o użyciu Cygwina w systemie Windows, wolę: cygpath -w "` which <appname> `"
mpasko256
12

W PowerShell jest gcmto sformatowana informacja o innych poleceniach. Jeśli chcesz pobrać tylko ścieżkę do pliku wykonywalnego, użyj .Source.

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

Ciekawostki:

  • Dostępne dla systemu Windows XP.
  • Dostępne od wersji PowerShell 1.0.
  • gcmjest aliasem polecenia Get-Commandcmdlet .
  • Bez żadnych parametrów wyświetla listę wszystkich dostępnych poleceń oferowanych przez powłokę hosta.
  • Można utworzyć własny alias ze Set-Alias which gcmi używać go tak: (which git).Source.
  • Oficjalne dokumenty: https://technet.microsoft.com/en-us/library/ee176842.aspx
kruk wulkaniczny
źródło
11

Mam funkcję w moim profilu programu PowerShell o nazwie „która”

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

Oto jak wygląda wyjście:

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:
Fez
źródło
Żadne inne rozwiązanie nie działało dla mnie, ale > get-command app.exe | format-listdziałało idealnie!
Alexander McFarlane
10

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

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

Zawiera „co” zawarte. Pamiętaj jednak, że wielkość liter ma znaczenie.

Uwaga: aby go zainstalować, gdzieś rozpakuj zip i dodaj ... \ UnxUtils \ usr \ local \ wbin \ do zmiennej env ścieżki systemowej.

Jon Court
źródło
2
wielkość
Ma kilka frustracji związanych z nowymi liniami; na przykład grep nie będzie pasował do EOL bez wpisania a .dla \ r. To na pewno 99% rozwiązanie!
dash-tom-bang
Tak, wielkość liter nie jest rozróżniana, jednak domyślnie w nazwach plików w systemie Windows nie jest rozróżniana wielkość liter.
Wernfried Domscheit
8

Nie ma w magazynie systemu Windows, ale jest on zapewniany przez Services for Unix i istnieje kilka prostych skryptów wsadowych, które osiągają to samo, co ten .

Robert Gamble
źródło
1
Tyle że polecenie, które łączysz, wyświetla tylko zmienną PATH i nawet nie sprawdza, czy plik tam znajduje się.
Angel O'Sphere
8

Jeśli możesz znaleźć darmowy kompilator Pascal, możesz go skompilować. Przynajmniej działa i pokazuje niezbędny algorytm.

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.
Mawg mówi, że przywróć Monikę
źródło
21
Wow, są ludzie, którzy nadal używają Pascala? :-)
paxdiablo
6
Wyobrażam sobie, że są. Ale nie ja. Czy widziałeś wiersz program_date = '17 marca 1994 ';
Mawg mówi o przywróceniu Moniki
1
Jednostka my_funk;jest niepotrzebna. Dzięki za opublikowanie programu Pascal, przypomina mi o mojej młodości! Szkoda, że ​​Pascal nie ewoluował.
yannis
2
Och, ale tak się stało. Na przykład jest teraz zorientowany obiektowo. Świetna darmowa, wieloplatformowa implementacja i IDE na stronie lazarus-ide.org. Bezpośredni potomek Borland nadal mieszka w Delfach na embarcadero.com/products/delphi, co jest bardzo drogie (imo) za 299 USD za wydanie początkowe i 1 000 $ za wydanie „użyteczne”. Jest jednak wieloplatformowy - Windows, iOS, Mac, Android. Pobierz wersję próbną lub użyj Lazarusa i poczuj się 20 lat młodszy, -)
Mawg mówi, że przywróć Monikę
1
@yannis „szkoda, że ​​Pascal nie ewoluował” ... oprócz „Turbo Pascal” Andersa projektującego C # masz na myśli?
piers7 7
7

Najlepszą wersją tego, jaką znalazłem w systemie Windows, jest narzędzie „whereis” Josepha Newcomera, które jest dostępne (wraz ze źródłem) z jego strony .

Warto przeczytać artykuł o rozwoju „whereis”.

Tim Lesher
źródło
1
Późny komentarz: whereis ma problemy ze znalezieniem 64-bitowych plików wykonywalnych w Win 7 64-bit.
Axel Kemper
7

Możesz najpierw zainstalować Git z Downloading Git , a następnie otworzyć Git Bash i wpisać:

which app-name
hamidreza samsami
źródło
6

Żaden z portów Win32 systemu Unix, który mogłem znaleźć w Internecie, nie jest zadowalający, ponieważ wszystkie mają jedną lub więcej z tych wad:

  • Brak obsługi zmiennej PATHEXT systemu Windows. (Która definiuje listę rozszerzeń domyślnie dodanych do każdego polecenia przed skanowaniem ścieżki oraz w jakiej kolejności.) (Używam wielu skryptów tcl i nie ma publicznie dostępnych narzędzi, które mogłyby je znaleźć).
  • Brak obsługi stron kodowych cmd.exe, co powoduje, że wyświetlają ścieżki niepoprawnie ascii. (Jestem na to bardzo wrażliwy, z ç w moim imieniu :-))
  • Brak obsługi odrębnych reguł wyszukiwania w cmd.exe i wierszu polecenia programu PowerShell. (Żadne publicznie dostępne narzędzie nie znajdzie skryptów .ps1 w oknie PowerShell, ale nie w oknie cmd!)

Więc w końcu napisałem własny, który poprawnie obsługuje wszystkie powyższe.

Dostępne tam: http://jf.larvoire.free.fr/progs/which.exe

Jean-François Larvoire
źródło
Do Twojej wiadomości mam otwarte narzędzie, które.exe wspomniane powyżej, i wiele innych, na github.com/JFLarvoire/SysToolsLib . Możesz tam pobrać najnowszą wersję, zgłosić problemy itp.
Jean-François Larvoire,
6

Ten plik wsadowy używa obsługi zmiennych CMD w celu znalezienia polecenia, które zostanie wykonane na ścieżce. Uwaga: bieżący katalog jest zawsze wykonywany przed ścieżką) i zależnie od tego, które wywołanie API jest używane, inne lokalizacje są przeszukiwane przed / po ścieżce.

@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%)

Zobacz set /?po pomoc.


źródło
6

Używam GOW (GNU na Windows), który jest lekką wersją Cygwin. Możesz pobrać go z GitHub tutaj .

GOW (GNU w systemie Windows) to lekka alternatywa dla Cygwin. Korzysta z wygodnego instalatora Windows, który instaluje około 130 niezwykle użytecznych aplikacji UNIX typu open source skompilowanych jako natywne pliki binarne win32. Ma być tak mały, jak to możliwe, około 10 MB, w przeciwieństwie do Cygwin, który może działać znacznie powyżej 100 MB, w zależności od opcji. - O opisie (Brent R. Matzelle)

Zrzut ekranu z listą poleceń zawartych w GOW:

Wpisz opis zdjęcia tutaj

Prayson W. Daniel
źródło
5

Stworzyłem narzędzie podobne do Neda Batcheldera:

Wyszukiwanie plików .dll i .exe w ŚCIEŻCE

Chociaż moje narzędzie służy przede wszystkim do wyszukiwania różnych wersji dll, wyświetla więcej informacji (data, rozmiar, wersja), ale nie używa PATHEXT (mam nadzieję, że wkrótce zaktualizuję swoje narzędzie).

Michał Niklas
źródło
5

Wystarczy opublikować jeden plik wsadowy tego systemu 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

Badanie:

C:>wh ssh
C:\cygwin64\bin\ssh.EXE
C:\Windows\System32\OpenSSH\\ssh.EXE

Niezupełnie jednowierszowy, jeśli zawijasz kod w setlocal enableextensionsi endlocal.

bobbogo
źródło
2
Wolałbym to w wielu wierszach, abym mógł to zrozumieć. ;-)
Gringo Suave
4

Dla was użytkowników systemu Windows XP (którzy nie mają wherewbudowanego polecenia), napisałem polecenie „gdzie jak” jako rubygem o nazwiewhichr .

Aby go zainstalować, zainstaluj Ruby.

Następnie

gem install whichr

Uruchom to jak:

C:> whichr cmd_here

rogerdpack
źródło
3
Podejrzewam, że nie bierzesz udziału w głosowaniu, ponieważ sugerujesz robienie czegokolwiek w systemie Windows XP.
sebastian-c
1
Nie przegłosowałem, ale instalacja Ruby w celu zaimplementowania trywialnego polecenia jest również trudna do sprzedania. Powyżej znajduje się pętla for, którą można umieścić w skrypcie wsadowym.
Gringo Suave,
2
Czy drukuje początkowe wiersze utworu tematycznego do gry Wiedźmin, jeśli uruchomisz go w trybie pełnym? ;)
Agi Hammerthief
3

TCC i TCC / LE z JPSoft są zamiennikami CMD.EXE, które dodają znaczną funkcjonalność. Istotne dla pytania OP whichjest wbudowane polecenie dla procesorów poleceń rodziny TCC.

David G.
źródło
2

Użyłem whichmoduł z KMP przez jakiś czas, i to działa bardzo dobrze: https://www.npmjs.com/package/which Jest to świetna alternatywa wielu platform.

Teraz przełączyłem się na ten, whichktóry jest dostarczany z Git. Po prostu dodaj do swojej ścieżki /usr/binścieżkę z Git, która zwykle znajduje się w C:\Program Files\Git\usr\bin\which.exe. Plik whichbinarny będzie na C:\Program Files\Git\usr\bin\which.exe. Jest szybszy i działa również zgodnie z oczekiwaniami.

Giovanni Bassi
źródło
1

Spróbuj tego

set a=%~$dir:1
If "%for%"=="" (Echo %1 not found) else (echo %1 found at %a%)

źródło