Làm cách nào để tìm vị trí của tệp thực thi trong Windows?


154

Tôi nhớ rằng tôi đã sử dụng một công cụ có tên là wheređể tìm vị trí cho bất kỳ chương trình thực thi nào như thế này trong bảng điều khiển:

 C:\Tmp\Where myTool.exe
 C:\Program Files\MyApp\myTools.exe
 ....

Bây giờ tôi không thể tìm thấy công cụ này. Không chắc chắn nếu Windows có một công cụ tích hợp để thực hiện tìm kiếm đó?



NẾU ứng dụng đang chạy và bạn cần biết vị trí của nó, hãy sử dụng Process Explorer (từ Sys Internals).
Ganesh R.

6
wherelàm việc cho tôi trên Windows 7 Enterprise
Bohemian

4
PAGING OP: Vui lòng cập nhật câu trả lời được chấp nhận :)
Jake

1
@ David.Chu.ca vui lòng cập nhật câu trả lời được chấp nhận
Matt Frear

Câu trả lời:


351

Theo câu trả lời của StackOverflow tại Có tương đương với 'cái nào' trên windows không? , where.exethực hiện điều này trên Windows 7 và Windows Server 2003 trở lên:

Thí dụ

C:\> where ping

Đầu ra:

C:\Windows\System32\PING.EXE

19
Đây phải là câu trả lời chính xác vì nó hoạt động mà không cần cài đặt phần mềm bổ sung
Cookie

25
Một phần quan trọng của câu trả lời này là trong powershell, wherelà một bí danh mặc định cho Where-Object, vì vậy thay vào đó bạn cần sử dụng where.exe, hoặc gcm/Get-Command
Dave Andersen

2
Những gì về powershell. Làm thế nào tôi có thể đạt được điều tương tự trong powershell?
krv

1
@krv Như @DaveAndersen đã đề cập, trong powershell, bạn có thể nhập Get-Command ping(hoặc chỉ gcm ping), sẽ cung cấp cho bạn đường dẫn đầy đủ, cùng với một số thông tin khác.
Sam

22

EDIT: Tôi nên đã thêm, nếu bạn không thể sử dụng lệnh WHERE từ dấu nhắc lệnh, hãy kiểm tra biến PATH của bạn. (Chỉ cần sử dụng lệnh "path".) Đảm bảo C: \ Windows \ System32 nằm trong đường dẫn của bạn. Đó là nơi "where.exe" được đặt.

WHERE là lệnh bạn đang tìm kiếm! WHERE giống như một giao thoa giữa shell UNIX tích hợp "lệnh" và lệnh "xác định vị trí", trong đó nó hoạt động cho cả hai tệp thực thi lệnh và các tệp thông thường.

Nó cũng hơi phức tạp hơn một trong hai, mặc dù, nói chung là đơn giản

WHERE <file>

sẽ làm việc.

Nó khác với lệnh "định vị" ở chỗ nó không xem qua toàn bộ hệ thống tập tin. Thay vào đó, hành vi mặc định là tìm kiếm các tệp ở hai vị trí:

  • Thư mục hiện tại.
  • Tất cả các thư mục trong biến PATH.

Vì vậy, bất kỳ lệnh nào bạn có thể chạy trực tiếp từ dấu nhắc lệnh mà không chỉ định thư mục, sẽ được tìm thấy bởi lệnh WHERE. (Bởi vì bất kỳ lệnh nào như thế đã có trong danh sách biến PATH.)

Nếu bạn muốn tìm kiếm chỉ trong biến con đường lệnh, bạn có thể sử dụng:

WHERE "$path:<search text>"

Mặt khác, nếu bạn muốn tìm tất cả các bản sao của một tệp trong cây thư mục, bạn có thể sử dụng:

WHERE /R <Top Level Directory> <search text>

Cuối cùng, WHERE sẽ tìm thấy các lệnh và bất kỳ tệp nào có phần mở rộng từ biến PATHEXT mà không bao gồm phần mở rộng. Tất cả các tệp khác phải được chỉ định chính xác hoặc bằng ký tự đại diện.

Lấy ví dụ các tập tin "dxdiag.exe" và "dxdiagn.dll". Lưu ý lệnh sau và đầu ra của nó:

WHERE /R C:\Windows dxdiag

C:\Windows\System32\dxdiag.exe
C:\Windows\SysWOW64\dxdiag.exe
C:\Windows\WinSxS\amd64_microsoft-windows-d..x-directxdiagnostic_31bf3856ad364e35_6.2.9200.16384_none_7c8d3f96e7882ec7\dxdiag.exe
C:\Windows\WinSxS\x86_microsoft-windows-d..x-directxdiagnostic_31bf3856ad364e35_6.2.9200.16384_none_206ea4132f2abd91\dxdiag.exe

Nó thành công trong việc trả về tất cả các phiên bản của "dxdiag.exe" vì ".exe" là một trong những phần mở rộng trong biến PATHEXT. (Lưu ý: "WHERE dxdiag" cũng sẽ hoạt động tốt, vì C: \ Windows \ System32 nằm trong biến PATH.)

WHERE /R C:\Windows dxdiagn

mặt khác, không trả lại bất kỳ kết quả nào, vì "dll" không có trong PATHEXT.

Trong trường hợp này, hãy xem kết quả mà việc thêm ký tự đại diện cho chúng ta:

WHERE /R C:\Windows dxdiagn*

C:\Windows\System32\dxdiagn.dll
C:\Windows\System32\en-US\dxdiagn.dll.mui
C:\Windows\SysWOW64\dxdiagn.dll
C:\Windows\SysWOW64\en-US\dxdiagn.dll.mui
C:\Windows\WinSxS\amd64_microsoft-windows-d..iagnostic.resources_31bf3856ad364e35_6.2.9200.16384_en-us_daccd04369b09c70\dxdiagn.dll.mui
C:\Windows\WinSxS\amd64_microsoft-windows-d..x-directxdiagnostic_31bf3856ad364e35_6.2.9200.16384_none_7c8d3f96e7882ec7\dxdiagn.dll
C:\Windows\WinSxS\x86_microsoft-windows-d..iagnostic.resources_31bf3856ad364e35_6.2.9200.16384_en-us_7eae34bfb1532b3a\dxdiagn.dll.mui
C:\Windows\WinSxS\x86_microsoft-windows-d..x-directxdiagnostic_31bf3856ad364e35_6.2.9200.16384_none_206ea4132f2abd91\dxdiagn.dll

Nó trả về thành công tất cả các phiên bản của dxdiagn.dll.

Để biết thêm thông tin, sử dụng "WHERE /?". Hi vọng điêu nay co ich!


2
where where C:\Windows\System32\where.exe:)
vp_arth

1
@vp_arth Chỉ là suy nghĩ chính xác điều tương tự :)
Kỹ sư đảo ngược

10

sử dụng dir:

cd \
dir /s /b mytool.exe

các cd \phần thay đổi bạn vào thư mục gốc của ổ đĩa, để đảm bảo bắt đầu tìm kiếm ở trên cùng của hệ thống phân cấp.


Có vẻ như thực hiện một dòng lệnh Windows Search.
Ganesh R.

5
Đó là một tìm kiếm đệ quy của ổ đĩa và sẽ mất mãi mãi.
djhowell

6
Cách duy nhất để tìm các tệp thực thi mà AREN'T trong biến môi trường PATH là làm điều này. Ông không bao giờ chỉ định con đường của mình, ông nói bất kỳ thực thi .
John T

Nó không tìm thấy thực thi nhưng mất một lúc.
Michael Z

điều này tất nhiên chỉ hoạt động nếu bạn biết tên của người thực thi hoặc ít nhất là một phần của tên
Oliver Williams

9

Lưu ý rằng một số thứ có thể hơi khác một chút đối với PowerShell:

PS C:\Users\Rob.wb-devel> where ping

PS C:\Users\Rob.wb-devel> where git

PS C:\Users\Rob.wb-devel> whereis.bat git
C:\Program Files (x86)\Git\cmd\git.exe

PS C:\Users\Rob.wb-devel> where.exe git
C:\Program Files (x86)\Git\cmd\git.exe

Cảm ơn, điều này hoạt động cho cả cmd và PowerShell
Ding-Yi Chen

3

Thất vọng vì nó không được tích hợp như một lệnh đơn giản.

Tuy nhiên, có một số giải pháp, một trong số đó là một tệp bó .

Tạo một tệp bó (which.bat) như sau:

@setlocal
@set P2=.;%PATH%
@for %%e in (%PATHEXT%) do @for %%i in (%~n1%%e) do @if NOT "%%~$P2:i"=="" echo %%~$P2:i 

Cái này nhìn trong thư mục cục bộ, sẽ lấy tham số tên tệp có hoặc không có phần mở rộng và trả về kết quả khớp đầu tiên từ thư mục hiện tại hoặc trong PATH.

Sau đó chạy nó như which cmd.exetìm cmd.exe sẽ thực thi nếu bạn nhập cmd.


3

Trên cửa sổ, bạn có thể sử dụng tiện ích miễn phí Mọi công cụ tìm kiếm để tìm kiếm ngay lập tức bất kỳ tệp nào bằng tên đầy đủ hoặc một phần (nếu đĩa cứng của bạn được định dạng trong ntfs).


1
Sự khác biệt giữa đêm và ngày giữa cái này và cửa sổ tìm kiếm.
AnthonyVO


1

Trong PowerShell

(@($env:path.split(";")) + (pwd).Path)  | where { dir $_ -ErrorAction SilentlyContinue |? Name -eq foo.exe }

Bạn có thể dễ dàng chuyển đổi nó thành Cmdlet.

Một cách khác để thực hiện điều này, như được đề xuất trong một chỉnh sửa:

get-command notepad.exe | select Source

0

Nếu bạn chỉ cần đường dẫn để khởi chạy nó, tốt hơn là sử dụng lệnh start. Ví dụ: bạn có thể sử dụng "start chrome.exe" để bắt đầu Chrom {e | ium}, bất kể nó được cài đặt ở đâu.


0

Heh, tôi chỉ cần đăng tập tin một lô 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

Một thử nghiệm:

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ã setlocal enableextensionsendlocal, được yêu cầu cho người dùng không bật tiện ích mở rộng theo mặc định.

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.