it-swarm-vi.tech

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

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 đườ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 command in đườ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.

2107
namin

Windows Server 2003 trở lên (tức là mọi thứ sau Windows XP 32 bit) cung cấp chương trình where.exe thực hiện một số điều which làm, mặc dù nó phù hợp với tất cả các loại tệp, không chỉ là 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 where nt* tìm thấy tất cả các tệp trong %PATH% và thư mục hiện tại có tên bắt đầu bằng nt.

Hãy thử where /? để được giúp đỡ.

Lưu ý rằng Windows PowerShell định nghĩa where là bí danh cho Where-Object cmdlet , vì vậy nếu bạn muốn where.exe, bạn cần nhập tên đầy đủ thay vì bỏ qua phần mở rộng .exe.

2313
Michael Ratanapintha

Mặc dù các phiên bản sau của Windows có lệnh where, 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 giới hạn ở PATH 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ể Tweak nó khá dễ dàng cho các quy tắc tìm kiếm cụ thể.

274
paxdiablo

Trong PowerShell, Get-Command sẽ 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 các lệnh ghép ngắn PowerShell, hàm, bí danh, tệp có phần mở rộng thực thi tùy chỉnh thông qua $Env:PATHEXT, v.v. được xác định cho Shell hiện tại (khá giống với type -a foo của Bash) - làm cho nó trở nên tốt hơn so với các công cụ khác như where.exe, which.exe, v.v không biết về các lệnh PowerShell này.

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 có cửa sổ khác (python, Ruby, Perl, v.v.), các phần mở rộng tệp cho các tệp thực thi đó cần được thêm vào biến môi trường PATHEXT (mặc định là .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 PATH là có thể thực thi được. Vì Get-Command cũng tôn vinh biến này, nó có thể được mở rộng để liệt kê các tệp 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 bí danh với sal which gcm (dạng ngắn của set-alias which get-command).

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

126
shalomb

Trong Windows PowerShell:

set-alias which where.exe
51
cmcginty

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 ở đây:Manwich của tôi! PowerShell Mà

38
RexE

GnuWin32 công cụ có which, cùng với một loạt các công cụ Unix khác.

33
Ferruccio

Trong Windows CMD which gọi where:

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

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 lệnh Windows của bạn hoặc sử dụng * nix Shell mà bạn chọn). Nó cung cấp cho bạn toàn bộ Máy chủ của các lệnh * nix (như which) cho Windows và bạn chỉ có thể đưa thư mục đó vào PATH của mình.

16
palswim

Trong PowerShell, đó là gcm, cung 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 git hoặc (gcm git).Source

Các mẩu tin:

  • Có sẵn cho Windows XP.
  • Có sẵn kể từ PowerShell 1.0.
  • gcm là bí danh của Get-Command cmdlet .
  • 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 Host Shell.
  • Bạn có thể tạo bí danh tùy chỉnh với Set-Alias which gcm và sử dụng như: (which git).Source.
  • Tài liệu chính thức: https://technet.Microsoft.com/en-us/l Library/ee176842.aspx
12
vulcan raven

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:
10
Fez

Đi lấy 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 Nice unix 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.

9
Jon Court

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

Không có trong 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 cái này .

7
Robert Gamble

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.

7
Tim Lesher

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
user6017774

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 thể tin đượ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. (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

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

 Enter image description here

6
Prayson W. Daniel

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
Michał Niklas

Trước tiên, bạn có thể cài đặt Git từĐang tải xuống Git, sau đó mở Git Bash và gõ:

which app-name
5
hamidreza samsami

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

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

Sau đó

gem install whichr

Chạy nó như:

C:> whichr cmd_here

3
rogerdpack

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, which là một lệnh dựng sẵn cho các bộ xử lý lệnh gia đình TCC.

3
David G

Tôi đã sử dụng mô-đun which 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 which đi kèm với Git. Chỉ cần thêm vào đường dẫn của bạn đường dẫn /usr/bin từ Git, thường là tại C:\Program Files\Git\usr\bin\which.exe. Nhị phân which sẽ ở C:\Program Files\Git\usr\bin\which.exe. Nó nhanh hơn và cũng hoạt động như mong đợi.

2
Giovanni Bassi

thử đi

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