Bagaimana cara menemukan lokasi yang dapat dieksekusi di Windows?

154

Saya ingat bahwa saya menggunakan alat yang disebut whereuntuk menemukan lokasi untuk program yang dapat dieksekusi seperti ini di konsol:

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

Sekarang saya tidak dapat menemukan alat ini. Tidak yakin apakah Windows memiliki alat bawaan untuk melakukan pencarian itu?

David.Chu.ca
sumber
1
Berbagai jawaban di atas Apakah ada padanan dengan 'yang' di windows? - Stack Overflow
Satanicpuppy
JIKA aplikasi sedang berjalan & Anda perlu tahu lokasinya, gunakan Process Explorer (dari Sys Internals).
Ganesh R.
6
wherebekerja untuk saya di Windows 7 Enterprise
Bohemian
4
PAGING OP: Harap perbarui jawaban yang diterima :)
Jake
1
@ David.Chu.ca harap perbarui jawaban yang diterima
Matt Frear

Jawaban:

351

Menurut jawaban StackOverflow di Apakah ada yang setara dengan 'yang' pada windows? , where.exelakukan ini pada Windows 7 dan Windows Server 2003 dan yang lebih baru:

Contoh

C:\> where ping

Keluaran:

C:\Windows\System32\PING.EXE
Simon D
sumber
19
Ini harus dijadikan jawaban yang benar karena berfungsi tanpa menginstal perangkat lunak tambahan
Cookie
25
Bagian penting dari jawaban ini adalah bahwa dalam PowerShell, whereadalah alias default untuk Where-Object, jadi Anda malah perlu menggunakan where.exe, atau gcm/Get-Command
Dave Andersen
2
Bagaimana dengan PowerShell. Bagaimana saya bisa mencapai hal yang sama di PowerShell?
krv
1
@krv Seperti @DaveAndersen sebutkan, di powershell Anda dapat mengetik Get-Command ping(atau hanya gcm ping), yang akan memberi Anda path lengkap, bersama dengan beberapa info lainnya.
Sam
22

EDIT: Saya seharusnya menambahkan, jika Anda tidak dapat menggunakan perintah WHERE dari command prompt, periksa variabel PATH Anda. (Cukup gunakan perintah "jalur".) Pastikan C: \ Windows \ System32 ada di jalur Anda. Di situlah "where.exe" berada.

DIMANA adalah perintah yang Anda cari! WHERE seperti persilangan antara shell UNIX built-in "yang" dan "temukan" perintah, di mana ia bekerja untuk kedua perintah yang dapat dieksekusi dan file biasa.

Ini juga agak lebih kompleks daripada keduanya, meskipun, secara umum sederhana

WHERE <file>

akan bekerja.

Ini berbeda dari perintah "temukan" karena tidak mencari melalui seluruh sistem file. Sebaliknya, perilaku default adalah mencari file di dua lokasi:

  • Direktori saat ini.
  • Semua direktori dalam variabel PATH.

Jadi, perintah apa pun yang dapat Anda jalankan langsung dari command prompt tanpa menentukan direktori, akan ditemukan oleh perintah WHERE. (Karena perintah seperti itu sudah ada dalam daftar variabel PATH.)

Jika Anda ingin mencari hanya dalam variabel jalur perintah, Anda dapat menggunakan:

WHERE "$path:<search text>"

Jika, di sisi lain, Anda ingin menemukan semua salinan file di pohon direktori, Anda dapat menggunakan:

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

Akhirnya, WHERE akan menemukan perintah dan file apa pun dengan ekstensi dari variabel PATHEXT tanpa menyertakan ekstensi. Semua file lain harus ditentukan dengan tepat atau dengan wildcard.

Ambil contoh file "dxdiag.exe" dan "dxdiagn.dll". Perhatikan perintah berikut dan hasilnya:

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

Berhasil mengembalikan semua versi "dxdiag.exe" karena ".exe" adalah salah satu ekstensi dalam variabel PATHEXT. (Catatan: "WHERE dxdiag" akan berfungsi juga, karena C: \ Windows \ System32 ada dalam variabel PATH.)

WHERE /R C:\Windows dxdiagn

di sisi lain, gagal mengembalikan hasil apa pun, karena ".dll" tidak ada dalam PATHEXT.

Dalam hal ini, lihat hasil yang menambahkan wildcard memberi kita:

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

Berhasil mengembalikan semua versi dxdiagn.dll.

Untuk informasi lebih lanjut, gunakan "DI MANA /?". Semoga ini membantu!

geo
sumber
2
where where C:\Windows\System32\where.exe:)
vp_arth
1
@vp_arth Hanya memikirkan hal yang persis sama :)
Reversed Engineer
10

gunakan dir:

cd \
dir /s /b mytool.exe

yang cd \bagian perubahan Anda ke akar drive, untuk memastikan pencarian dimulai di bagian atas hirarki.

John T
sumber
Sepertinya melakukan pencarian baris perintah Windows.
Ganesh R.
5
Itu melakukan pencarian drive secara rekursif dan akan memakan waktu selamanya.
djhowell
6
Satu-satunya cara untuk menemukan executable yang TIDAK dalam variabel lingkungan PATH adalah dengan melakukan ini. Dia tidak pernah menentukan jalannya, dia mengatakan ada yang bisa dieksekusi .
John T
itu menemukan executable tetapi membutuhkan waktu.
Michael Z
ini tentu saja hanya berfungsi jika Anda tahu nama yang dapat dieksekusi atau setidaknya sebagian dari namanya
Oliver Williams
9

Perhatikan bahwa beberapa hal mungkin sedikit berbeda untuk 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
Rob Jens
sumber
Terima kasih, ini berfungsi untuk cmd dan PowerShell
Ding-Yi Chen
3

Frustrasi bahwa itu bukan bawaan sebagai perintah sederhana.

Namun, ada beberapa solusi, salah satunya adalah file batch .

Buat file batch (which.bat) sebagai berikut:

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

Ini terlihat di direktori lokal, akan mengambil parameter nama file dengan atau tanpa ekstensi, dan mengembalikan kecocokan pertama dari direktori saat ini atau di PATH.

Kemudian jalankan itu seperti which cmd.exemencari cmd.exe yang akan dijalankan jika Anda mengetik cmd.

bw
sumber
3

Di windows Anda dapat menggunakan utilitas gratis Semuanya mesin pencari untuk mencari secara instan file apa pun dengan nama lengkap atau sebagian (jika hard disk Anda diformat dalam ntfs).

harrymc
sumber
1
Perbedaan malam dan siang antara ini dan pencarian windows.
AnthonyVO
1

Jika Anda hanya menginginkan yang mana , proyek GnuWin32 memiliki banyak utilitas unix dengan masing-masing installer.

Justin Love
sumber
1

Di PowerShell

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

Anda dapat dengan mudah mengonversikan ini menjadi Cmdlet.

Cara lain untuk mencapai ini, seperti yang disarankan dalam edit:

get-command notepad.exe | select Source
Anupam
sumber
0

Jika Anda hanya perlu jalur untuk meluncurkannya, sering kali lebih baik menggunakan perintah mulai. Misalnya, Anda dapat menggunakan "start chrome.exe" untuk memulai Chrom {e | ium}, di mana pun ia diinstal.

Pengecut Anonim
sumber
0

Heh, saya hanya perlu memposting file batch satu liner Windows ini:

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

Sebuah tes:

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

Tidak cukup satu-liner jika Anda memasukkan kode setlocal enableextensionsdan endlocal, yang diperlukan untuk pengguna yang tidak memiliki ekstensi diaktifkan secara default.

bobbogo
sumber