Câu hỏi Có tương đương với 'cái gì' trên dòng lệnh của Windows không?


Đôi khi tôi gặp vấn đề về đường dẫn, một trong những script cmd của riêng tôi bị ẩn 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 đủ tới một chương trình trên dòng lệnh của Windows, chỉ là 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 chữa các vấn đề ẩn này.


1900
2017-11-20 04:19


gốc


Foredecker: "which" tìm kiếm PATH cho tệp thực thi sẽ chạy nếu bạn gõ một lệnh tại dấu nhắc trình bao. - Greg Hewgill
ví dụ, nếu bạn có 5 phiên bản 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õ "cái java" nào và nó cho bạn PATH vào nhị phân - ninesided
@Foredecker, MR nói đó là "nơi" 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 hợp lệ. 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
Tôi biết câu hỏi này xuất hiện trước SuperUser, nhưng nó có thể thuộc về đó. - palswim
Không có which lệnh trong Unix chuẩn. Tiện ích POSIX là type. C Shell có một lệnh, và một số hệ thống có nó như là một thực thi bên ngoài. Ví dụ, trên Debian Linux, which đến từ một gói được gọi là debutils. Bên ngoài này which không "nhìn thấy" vỏ được xây dựng trong, bí danh hoặc chức năng. type làm; Bash type có một tùy chọn để ngăn chặn điều đó và chỉ thực hiện tra cứu đường dẫn. - Kaz


Các câu trả lời:


Windows Server 2003 trở lên (tức là mọi thứ sau Windows XP 32 bit) cung cấp where.exe chương trình thực hiện một số which không, 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 ký tự đại diện, vì vậy where nt* tìm 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.

Thử where /? để được giúp đỡ.

Lưu ý rằng Windows PowerShell định nghĩa where làm bí danh cho các 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 .exe sự mở rộng.


2107
2017-11-20 05:52



Không phải bởi vì grep kiểm tra nội dung đầu vào của nó, mà bạn phải đưa ra một cách rõ ràng. cái nào và where.exe chỉ nhìn vào tên 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
@ Ajedi32 - Đúng vậy, cái nào không có trong XP. Như tôi đã nói, "Windows Server 2003 và sau đó". - Michael Ratanapintha
Hoạt động trong Windows 8 - rob
xem ra điều này wont làm việc trong powershell trừ khi bạn gõ where.exe - Jonny Leeds
Nhớ lấy where.exe không phải là nội trang hệ vỏ, bạn cần có %windir%\system32 về bạn %PATH% - đó có thể không phải là trường hợp, như sử dụng where cho thấy rằng bạn có thể đang làm việc trên các vấn đề với con đường của bạn! - Tomasz Gandor


Trong khi các phiên bản sau của Windows có where lệnh, bạn cũng có thể làm điều này với Windows XP bằng cách sử dụng các biến môi trường biến, 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 thêm bất kỳ công cụ nào và 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 (trong đị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 trong đó có thể xử lý tất cả các phần mở rộng trong PATHEXT (như Windows chính nó không), điều này một trong những trick:

@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ể tinh chỉnh nó khá dễ dàng cho các quy tắc tìm kiếm cụ thể.


257
2017-11-20 05:48



Này, tôi ước tôi đã học được điều đó! Quá xấu nó không hoạt động với MS-DOS hoặc Win9x (nghĩa là, với command.com). (Raymond Chen có một phiên bản "phức tạp" hơn bạn có thể biến thành một tập tin thực thi: blogs.msdn.com/oldnewthing/archive/2005/01/20/357225.aspx ) - Michael Ratanapintha
@ Michael, nếu bạn vẫn đang sử dụng DOS hoặc Win95, việc tìm kiếm tệp thực thi trên đường dẫn là ít nhất các vấn đề của bạn :-) - paxdiablo
cửa sổ nhận ra nhiều hơn .exe như thực thi. Lần trước tôi đã mã hóa which trở lại trong W95 / DOS ngày amdittedly, thứ tự tìm kiếm là - dir hiện tại, sau đó mỗi đường dẫn dir, cho cmd.com, sau đó cmd.exe, sau đó cmd.bat Vì vậy, ngay cả cmd.bat trong thư mục hiện hành được thực hiện befroe cmd.exe soemwhere trong con đường - Mawg
@mawg, bản gốc là nơi bạn biết phần mở rộng vì nó phản chiếu dưới UNIX (nơi mà thủ thuật thêm mở rộng không xảy ra). Bây giờ tôi đã thêm một cái 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 nhiều như một kịch bản. Đầu tiên, nó sẽ thử lệnh unadorned sau đó mỗi lệnh mở rộng. Hy vọng rằng sẽ giúp. Bạn có thể tinh chỉnh nó theo nhu cầu của bạn như bạn thấy phù hợp (nếu bạn muốn cùng một thứ tự tìm kiếm như với Windows ví dụ - điều này cho thấy tất cả các khả năng). - paxdiablo
Để biến điều này thành tập lệnh batch, 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 nó vào một tập lệnh alias.bat mà bạn tải mỗi khi bạn chạy cmd.exe (đặt kịch bản trên vào một thư mục mới có tên là C: \ usr \ aliases): DOSKEY which=C:\usr\aliases\which.bat $*  Sau đó, bạn có thể tạo một kịch bản để khởi chạy cmd.exe với tệp alias.bat: cmd.exe /K E:\usr\aliases\alias.bat - Brad T.


Dưới PowerShell get-command sẽ tìm thấy các tệp thi hành ở mọi nơi 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, các hàm, bí danh, các tệp có các phần mở rộng thực thi tùy chỉnh qua $Env:PATHEXT, vv được định nghĩa cho vỏ hiện tại (khá giống với bash's type -a foo) - 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 các lệnh PowerShell này.

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


105
2017-11-26 02:07





Trong cửa sổ PowerShell:

set-alias which where.exe

39
2017-11-30 23:00





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 đây dưới dạng tương đương thô (thay thế tên chương trình cho tên tệp thi hành của bạn):

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

Thêm ở đây: http://www.codeassassin.com/blog/PermaLink,guid,fd1967d1-f844-4e29-82e2-f2d6424b4ef9.aspx


37
2017-11-20 05:16



Tôi đã tìm kiếm lệnh này pithy powershell chính xác. Tôi đã được sử dụng where.exe nhưng phải mess xung quanh với mã lỗi trên đầu trang của phân tích đầu ra của nó là xa kém hơn một giải pháp powerhell bản địa. Cảm ơn! - scobi
Nếu bạn có PowerShell, bạn nên sử dụng Get-Command. - jpmc26
Nhưng ($Env:Path).Split(";") | Get-ChildItem -filter programName* rất dễ dàng để nhập ... ;-) - Craig
Downvoting ủng hộ Get-Command (xin lỗi @RexE) - piers7
Điều này cũng không thành công nếu bạn có một biến trong đường dẫn của bạn thường được giải quyết bởi hệ thống (aka% JAVA_HOME%). - dragon788


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


31
2017-11-20 06:44



Sử dụng để tải xuống sourceforge.net/projects/getgnuwin32/?source=dlp - Kalpesh Soni


Trong Windows CMD which cuộc gọi where:

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

19
2018-04-01 12:02





Ngạc nhiên là không ai đề cập đến cygwin như một giải pháp được nêu ra. Nếu bạn không nhớ sử dụng giải pháp của bên thứ ba, thì cygwin là cách để đi.

Cygwin cung cấp 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 vỏ lệnh Windows của bạn, hoặc sử dụng một vỏ * nix mà 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ể bao gồm thư mục đó trong PATH.


15
2017-10-12 17:02



GnuWin32 được đề cập trước đó bởi Ferruccio tốt hơn nhiều trong trường hợp này vì bạn có thể có nguồn gốc Ở đâu 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 where.exe có vẻ như cuộc gọi đúng. Mặc dù, tôi đặt các công cụ GnuWin32 vào một \ 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 hàng loạt) mà chúng không được cài đặt cục bộ. - Craig
Khi chúng ta nói về việc sử dụng Cygwin trong Windows, tôi thích: cygpath -w "` <appname> `" - mpasko256