Có tương đương với 'cái nào' trên dòng lệnh Windows không?


2352

Vì đôi khi tôi gặp vấn đề về đường dẫn, trong đó một chương trình cmd của riêng tôi bị ẩn (bị che khuất) bởi một chương trình khác (trước đó trên đường dẫn), tôi muốn có thể tìm thấy đường dẫn đầy đủ đến một chương trình trên dòng lệnh Windows, được đưa ra chỉ tên của nó

Có tương đương với lệnh UNIX 'which' không?

Trên UNIX, which commandin đường dẫn đầy đủ của lệnh đã cho để dễ dàng tìm và sửa các lỗi đổ bóng này.


3
Foredecker: "which" tìm kiếm PATH cho tệp thực thi sẽ được chạy nếu bạn gõ lệnh tại dấu nhắc shell.
Greg Hewgill

3
Ví dụ, nếu bạn có 5 phiên bản của Java được cài đặt và bạn không biết cái nào đang được sử dụng, bạn có thể gõ "mà java" và nó mang lại cho bạn những PATH đến nhị phân
ninesided

9
@Foredecker, MR nói rằng "ở đâu" trong Win2k3 nhưng Win2k3 không phải là một phần của câu hỏi. Nếu "đâu" không có trong các phiên bản Windows khác, các câu trả lời khác cũng có giá trị. IMNSHO, câu trả lời hoạt động trên tất cả các phiên bản Windows là tốt nhất. Ngoài ra, các câu trả lời khác không sai, chỉ là những cách khác nhau để làm điều đó.
paxdiablo

36
Tôi biết câu hỏi này phát sinh trước SuperUser, nhưng có lẽ nó thuộc về nó.
palswim

16
Không có whichlệnh trong Unix tiêu chuẩn. Tiện ích POSIX là type. C Shell có lệnh nào và một số hệ thống có lệnh thực thi bên ngoài. Chẳng hạn, trên Debian Linux, whichxuất phát từ gói được gọi debutils. Bên ngoài whichnày không "nhìn thấy" các hàm dựng sẵn, bí danh hoặc hàm. typelàm; Bash's typecó một tùy chọn để ngăn chặn điều đó và chỉ cần thực hiện tra cứu đường dẫn.
Kaz

Câu trả lời:


2551

Windows Server 2003 trở lên (tức là mọi thứ sau Windows XP 32 bit) cung cấp where.exechương trình thực hiện một số việc which, mặc dù nó phù hợp với tất cả các loại tệp, không chỉ các lệnh thực thi. (Nó không khớp với các lệnh shell tích hợp như cd.) Nó thậm chí sẽ chấp nhận các ký tự đại diện, vì vậy sẽ where nt*tìm thấy tất cả các tệp trong %PATH%thư mục hiện tại và của bạn có tên bắt đầu bằng nt.

Hãy cố gắng where /?giúp đỡ.

Lưu ý rằng Windows PowerShell định nghĩa wherenhư một bí danh cho các Where-Objectlệnh , vì vậy nếu bạn muốn where.exe, bạn cần phải gõ tên đầy đủ thay vì bỏ qua .exephần mở rộng.


30
Không, bởi vì grep kiểm tra nội dung đầu vào của nó, mà bạn phải cung cấp rõ ràng. whichwhere.exe chỉ nhìn vào tên của các tệp trong một tập hợp các thư mục được đặt trong các biến môi trường PATH.
Michael Ratanapintha

12
@ Ajedi32 - Đúng, đó không phải là trong XP. Như tôi đã nói, "Windows Server 2003 trở lên".
Michael Ratanapintha

24
Hoạt động trong Windows 8
cướp

57
xem ra rằng điều này sẽ không hoạt động trong powershell trừ khi bạn gõ where.exe
JonnyRaa

17
Hãy nhớ rằng đó where.exekhông phải là một phần mềm dựng sẵn, bạn cần phải có %windir%\system32trên %PATH%đó - có thể không phải như vậy, vì sử dụng wherecho thấy rằng bạn có thể đang làm việc với các vấn đề với con đường của mình!
Tomasz Gandor

288

Mặc dù các phiên bản sau của Windows có wherelệnh, bạn cũng có thể thực hiện việc này với Windows XP bằng cách sử dụng các công cụ sửa đổi biến môi trường, như sau:

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

Bạn không cần bất kỳ công cụ bổ sung nào và nó không bị giới hạn PATHbởi vì bạn có thể thay thế bất kỳ biến môi trường nào (theo định dạng đường dẫn, tất nhiên) mà bạn muốn sử dụng.


Và, nếu bạn muốn một tiện ích có thể xử lý tất cả các tiện ích mở rộng trong PATHEXT (như chính Windows), thì điều này thực hiện thủ thuật:

@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

Nó thực sự trả về tất cả các khả năng nhưng bạn có thể điều chỉnh nó khá dễ dàng cho các quy tắc tìm kiếm cụ thể.


7
Này, tôi ước tôi đã học được điều đó! Quá tệ, nó không hoạt động với MS-DOS hoặc Win9x (nghĩa là với lệnh.com). (Raymond Chen có một phiên bản nhiều "công phu", bạn có thể biến thành một tập tin batch: blogs.msdn.com/oldnewthing/archive/2005/01/20/357225.aspx )
Michael Ratanapintha

110
@Michael, nếu bạn vẫn đang sử dụng DOS hoặc Win95, việc tìm kiếm các tệp thực thi trên đường dẫn là vấn đề ít nhất của bạn :-)
paxdiablo

cửa sổ nhận ra nhiều hơn .exe là thực thi. Lần trước tôi đã mã hóa whichtrở lại trong W95 / DOS ngày một cách đầy đủ, thứ tự tìm kiếm là - thư mục hiện tại, sau đó mỗi thư mục đường dẫn, cho cmd.com, sau đó cmd.exe, sau đó cmd.bat, thậm chí cmd.bat trong thư mục hiện tại là thực hiện befroe cmd.exe ở mọi nơi trên đường dẫn
Mawg nói rằng khôi phục lại Monica

3
@mawg, bản gốc là nơi bạn biết tiện ích mở rộng vì nó phản ánh điều đó trong UNIX (nơi mà thủ thuật thêm tiện ích mở rộng không xảy ra). Bây giờ tôi đã thêm một thứ có thể làm những gì bạn muốn nhưng nó không còn là một lệnh đơn giản giống như một tập lệnh. Đầu tiên, nó sẽ thử lệnh không được cung cấp sau đó từng lệnh mở rộng. Mong rằng sẽ giúp. Bạn có thể điều chỉnh nó theo nhu cầu của mình khi bạn thấy phù hợp (nếu bạn muốn có thứ tự tìm kiếm tương tự như với Windows chẳng hạn - điều này cho thấy tất cả các khả năng).
paxdiablo

2
Để biến tập lệnh này thành tập lệnh bó, hãy tạo một tệp có tên "which.bat": @echo off for %%i in (%1) do @echo. %%~$PATH:%i Để thêm tập tin vào tập lệnh alias.bat mà bạn tải mỗi khi bạn chạy cmd.exe (đặt tập lệnh trên vào thư mục mới có tên C: \ usr \ aliases): DOSKEY which=C:\usr\aliases\which.bat $* Sau đó, bạn có thể tạo một tập lệnh để khởi chạy cmd.exe với tệp alias.bat: cmd.exe /K E:\usr\aliases\alias.bat
Brad T.

152

Trong PowerShell, Get-Commandsẽ tìm thấy các tệp thực thi ở bất cứ đâu trong $Env:PATH.

Get-Command eventvwr

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

Nó cũng tìm thấy PowerShell cmdlets, chức năng, bí danh, tác phẩm với thực thi tùy chỉnh mở rộng qua $Env:PATHEXTvv định nghĩa cho vỏ hiện tại (khá giống như Bash type -a foo) - làm cho nó tốt hơn go-to hơn các công cụ khác như where.exe, which.exe, vv mà không nhận thức được những Các lệnh PowerShell.

Tìm các tệp thực thi chỉ sử dụng một phần của tên

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

Tìm thực thi tùy chỉnh

Để tìm các tệp thực thi không phải windows khác (python, ruby, perl, v.v.), phần mở rộng tệp cho các tệp thực thi đó cần được thêm vào PATHEXTbiến môi trường (mặc định .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL) để xác định các tệp có các phần mở rộng này trong PATHtệp thực thi. Như Get-Commandcũng tôn vinh biến này, nó có thể được mở rộng để liệt kê các thực thi tùy chỉnh. ví dụ

$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

Bạn có thể nhanh chóng thiết lập một bí danh với sal which gcm(dạng ngắn set-alias which get-command).

Thêm thông tin và ví dụ có thể được tìm thấy dưới sự giúp đỡ trực tuyến cho Get-Command.


2
Nó tìm thấy nhiều hơn là chỉ thực thi. Nó cũng bắt các tệp lệnh
Maximilian Burszley

2
@ TheIncorritable1 - nếu bạn có nghĩa là các tệp lệnh như tệp bó ( .BAT,, .CMDv.v.), chúng được coi là có thể thực thi được vì các phần mở rộng của chúng được đặt tên trong PATHEXTbiến (theo mặc định là PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL). Loại thực thi khác (ví dụ .py, .rb, vv) có thể được bổ sung bằng cách thêm phần mở rộng tập tin trong và tạo ra một hiệp hội thực thi với assoc/ ftype- ví dụ docs.python.org/3.3/using/...
shalomb


40

Nếu bạn đã cài đặt PowerShell (mà tôi khuyên dùng), bạn có thể sử dụng lệnh sau dưới dạng tương đương thô (tên chương trình thay thế cho tên thực thi của bạn):

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

Thêm nữa là: Manwich của tôi! PowerShell nào


1
Tôi đã tìm kiếm lệnh pithy powershell chính xác này. Tôi đã sử dụng where.exe nhưng phải loay hoay với mã lỗi trên đầu phân tích cú pháp đầu ra của nó kém hơn nhiều so với giải pháp powershell riêng. Cảm ơn!
scobi

9
Nhưng ($Env:Path).Split(";") | Get-ChildItem -filter programName*thật dễ dàng để gõ ... ;-)
Craig

Điều này cũng thất bại nếu bạn có một biến trong đường dẫn thường được hệ thống giải quyết (hay còn gọi là% JAVA_HOME%).
dragon788

Tôi không thể làm cho which.exe hoạt động, tôi đã thử nó và nó hoạt động.
Asfand Qazi


24

Trong Windows whichcuộc gọi CMD where:

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

17

Cygwin là một giải pháp. Nếu bạn không phiền khi sử dụng giải pháp của bên thứ ba, thì Cygwin là cách tốt nhất.

Cygwin mang đến cho bạn sự thoải mái của * nix trong môi trường Windows (và bạn có thể sử dụng nó trong trình vỏ lệnh Windows của mình hoặc sử dụng trình bao * nix bạn chọn). Nó cung cấp cho bạn một loạt các lệnh * nix (như which) cho Windows và bạn chỉ có thể đưa thư mục đó vào PATH.


10
GnuWin32 được đề cập trước đó bởi Ferruccio trong trường hợp này tốt hơn nhiều vì bạn có thể có nguồn gốc ở nơi thực thi một mình.
Piotr Dobrogost

GnuWin32 là tuyệt vời và tôi sử dụng nó, nhưng nếu bạn muốn chức năng này mà không cần cài đặt các công cụ GnuWin32 trong đó.exe có vẻ như là cuộc gọi đúng. Mặc dù, tôi đã đặt các công cụ GnuWin32 trong \ bin $ share trên mạng của chúng tôi để tôi có thể sử dụng chúng từ các máy trạm (và trong các tệp bó) không được cài đặt cục bộ.
Craig

1
Khi chúng ta nói về việc sử dụng Cygwin trong Windows, tôi thích: cygpath -w "` mà <appname> `"
mpasko256

12

Trong PowerShell, nó gcmcung cấp thông tin được định dạng về các lệnh khác. Nếu bạn muốn truy xuất chỉ đường dẫn để thực thi, hãy sử dụng.Source .

Ví dụ: gcm githoặc(gcm git).Source

Các mẩu tin:

  • Có sẵn cho Windows XP.
  • Có sẵn kể từ PowerShell 1.0.
  • gcmlà một bí danh của Get-Commandcmdlet .
  • Không có bất kỳ tham số nào, nó liệt kê tất cả các lệnh có sẵn được cung cấp bởi vỏ máy chủ.
  • Bạn có thể tạo một bí danh tùy chỉnh với Set-Alias which gcmvà sử dụng nó như : (which git).Source.
  • Tài liệu chính thức: https://technet.microsoft.com/en-us/l Library / ee176842.aspx

11

Tôi có một chức năng trong hồ sơ PowerShell của mình có tên 'which'

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

Đây là những gì đầu ra trông như thế nào:

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:

Không có giải pháp nào khác làm việc cho tôi nhưng > get-command app.exe | format-listhoạt động hoàn hảo!
Alexander McFarlane

10

Truy cập unxutils từ đây: http://sourceforge.net/projects/unxutils/

vàng trên nền tảng windows, đặt tất cả các tiện ích unix đẹp mắt trên một cửa sổ DOS tiêu chuẩn. Đã sử dụng nó vài năm.

Nó có một 'cái' bao gồm. Lưu ý rằng đó là trường hợp nhạy cảm mặc dù.

NB: để cài đặt, nó sẽ phát nổ zip ở đâu đó và thêm ... \ UnxUtils \ usr \ local \ wbin \ vào biến env đường dẫn hệ thống của bạn.


2
nó không phân biệt chữ hoa chữ thường, tôi cũng phải nói java.exe thay vì java - windows 7
Kalpesh Soni

Nó có một vài sự thất vọng mặc dù phải làm với các dòng mới; grep chẳng hạn sẽ không khớp với EOL mà không cần bạn đặt vào .\ r. Đó là một giải pháp 99% mặc dù chắc chắn!
dash-tom-bang

Có, nó không phân biệt chữ hoa chữ thường, tuy nhiên theo tên tệp mặc định trong Windows cũng không phân biệt chữ hoa chữ thường.
Wernfried Domscheit

8

Không có trong kho Windows nhưng nó được cung cấp bởi Dịch vụ cho Unix và có một số tập lệnh bó đơn giản trôi nổi xung quanh để thực hiện điều tương tự như thế này .


1
Ngoại trừ lệnh bạn liên kết chỉ xuất ra biến PATH và thậm chí không kiểm tra xem tệp có được tìm thấy ở đó không.
Thiên thần O'Sphere

8

Nếu bạn có thể tìm thấy một trình biên dịch Pascal miễn phí, bạn có thể biên dịch nó. Ít nhất là nó hoạt động và hiển thị các thuật toán cần thiết.

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.

21
Wow, có người vẫn đang sử dụng Pascal? :-)
paxdiablo

6
Tôi tưởng tượng rằng có. Nhưng không phải tôi. Bạn có thấy dòng chương trình_date = '17 tháng 3 năm 1994 ';
Mawg nói rằng phục hồi Monica

1
Các đơn vị my_funk;là không cần thiết. Cảm ơn bạn đã đăng một chương trình Pascal, nhắc nhở tôi về tuổi trẻ của mình! Thật đáng tiếc khi Pascal không phát triển.
yannis

2
Ồ, nhưng nó đã làm. Bây giờ nó là đối tượng hướng, ví dụ. Có một IDE miễn phí, đa nền tảng, triển khai và IDE tuyệt vời tại lazarus-ide.org Và một hậu duệ trực tiếp của Borland vẫn sống ở Delphi tại embarcadero.com/products/delphi rất đắt (imo) với giá $ 299 cho phiên bản bắt đầu và $ 1k cho phiên bản "có thể sử dụng". Tuy nhiên, nó là nền tảng chéo - windows, iOs, Mac, Android. Nhận phiên bản dùng thử hoặc sử dụng Lazarus và cảm thấy trẻ hơn 20 tuổi, -)
Mawg nói rằng phục hồi Monica

1
@yannis "thật đáng tiếc khi Pascal không phát triển" ... ngoài 'Turbo Pascal' Anders đang tiếp tục thiết kế C #, ý bạn là gì?
bến tàu7

7

Phiên bản tốt nhất mà tôi đã tìm thấy trên Windows là tiện ích "whereis" của Joseph Newcom, có sẵn (có nguồn) từ trang web của anh ấy .

Bài viết về sự phát triển của "whereis" rất đáng đọc.


1
Nhận xét muộn: trong đó có vấn đề khi tìm tệp thực thi 64 bit trong Win 7 64 bit.
Axel Kemper


6

Không có cổng Win32 nào của Unix mà tôi có thể tìm thấy trên Internet là không chính xác, bởi vì tất cả chúng đều có một hoặc nhiều trong số những thiếu sót sau:

  • Không hỗ trợ biến Windows PATHEXT. (Xác định danh sách các tiện ích mở rộng được thêm vào từng lệnh trước khi quét đường dẫn và theo thứ tự.) (Tôi sử dụng rất nhiều tập lệnh tcl và không có công cụ nào có thể tìm thấy chúng.)
  • Không hỗ trợ cho các trang mã cmd.exe, điều này làm cho chúng hiển thị các đường dẫn với các ký tự không phải mã ascii không chính xác. (Tôi rất nhạy cảm với điều đó, với ç trong tên của tôi :-))
  • Không hỗ trợ các quy tắc tìm kiếm riêng biệt trong cmd.exe và dòng lệnh PowerShell. (Không có công cụ có sẵn công khai nào sẽ tìm thấy các tập lệnh .ps1 trong cửa sổ PowerShell, nhưng không có trong cửa sổ cmd!)

Vì vậy, cuối cùng tôi đã viết riêng của mình, cái mà điều chỉnh tất cả những điều trên một cách chính xác.

Có sẵn ở đó: http://jf.larvoire.free.fr/progs/which.exe


FYI Tôi đã mở nguồn công cụ which.exe của tôi được đề cập ở trên và nhiều công cụ khác, trên github.com/JFLarvoire/SysToolsLib . Bạn có thể nhận được phiên bản mới nhất ở đó, báo cáo các vấn đề, v.v.
Jean-François Larvoire

6

Tệp bó này sử dụng xử lý biến CMD để tìm lệnh sẽ được thực thi trong đường dẫn. Lưu ý: rằng thư mục hiện tại luôn được thực hiện trước đường dẫn) và tùy thuộc vào lệnh gọi API nào được sử dụng, các vị trí khác được tìm kiếm trước / sau đường dẫn.

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

Xem set /?để được giúp đỡ.


6

Tôi đang sử dụng GOW (GNU trên Windows), phiên bản nhẹ của Cygwin. Bạn có thể lấy nó từ GitHub tại đây .

GOW (GNU trên Windows) là sự thay thế nhẹ cho Cygwin. Nó sử dụng trình cài đặt Windows tiện lợi, cài đặt khoảng 130 ứng dụng UNIX mã nguồn mở cực kỳ hữu ích được biên dịch dưới dạng nhị phân win32 gốc. Nó được thiết kế nhỏ nhất có thể, khoảng 10 MB, trái ngược với Cygwin có thể chạy tốt hơn 100 MB tùy theo tùy chọn. - Giới thiệu về Mô tả (Brent R. Matzelle)

Ảnh chụp màn hình danh sách các lệnh có trong GOW:

Nhập mô tả hình ảnh ở đây


5

Tôi đã tạo công cụ tương tự như Ned Batchelder:

Tìm kiếm tập tin dll và .exe trong PATH

Mặc dù công cụ của tôi chủ yếu để tìm kiếm các phiên bản dll khác nhau nhưng nó hiển thị thêm thông tin (ngày, kích thước, phiên bản) nhưng nó không sử dụng PATHEXT (tôi hy vọng sẽ sớm cập nhật công cụ của mình).


5

Chỉ cần đăng tập tin hàng loạt của Windows này:

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

Bài kiểm tra:

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

Không hoàn toàn là một lớp lót nếu bạn bọc mã trong setlocal enableextensionsendlocal.


2
Tôi thích điều đó trong nhiều dòng để tôi có thể hiểu nó. ;-)
Gringo Suave

4

Đối với bạn, người dùng Windows XP (không có wherelệnh tích hợp), tôi đã viết một lệnh "giống như" như một rubygem được gọiwhichr .

Để cài đặt nó, cài đặt Ruby.

Sau đó

gem install whichr

Chạy nó như:

C:> whichr cmd_here


3
Tôi nghi ngờ rằng bạn đang bị hạ thấp vì bạn đang đề xuất làm bất cứ điều gì trên Windows XP.
sebastian-c

1
Không downvote nhưng cài đặt Ruby để thực hiện một lệnh tầm thường cũng là một việc khó bán. Có một vòng lặp for ở trên có thể được đưa vào một tập lệnh bó.
Gringo Suave

2
Nó có in các dòng mở đầu cho bài hát chủ đề cho The Witcher nếu bạn chạy nó ở chế độ dài dòng không? ;)
Agi Hammerthief

3

TCC và TCC / LE từ JPSoft là các thay thế CMD.EXE có thêm chức năng quan trọng. Liên quan đến câu hỏi của OP, whichlà một lệnh dựng sẵn cho bộ xử lý lệnh gia đình TCC.


2

Tôi đã sử dụng which mô-đun từ npm khá lâu và nó hoạt động rất tốt: https://www.npmjs.com/package/which Đây là một sự thay thế đa nền tảng tuyệt vời.

Bây giờ tôi chuyển sang whichcái đi kèm với Git. Chỉ cần thêm vào đường dẫn của bạn đường /usr/bindẫn từ Git, thường là tại C:\Program Files\Git\usr\bin\which.exe. Các whichnhị phân sẽ có mặt tại C:\Program Files\Git\usr\bin\which.exe. Nó nhanh hơn và cũng hoạt động như mong đợi.


1

thử cái này

set a=%~$dir:1
If "%for%"=="" (Echo %1 not found) else (echo %1 found at %a%)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.