Menemukan jalur program yang akan dijalankan dari baris perintah di Windows

128

Katakanlah saya memiliki program yang X.EXEdiinstal di folder c:\abcd\happy\pada sistem. Folder berada di jalur sistem. Sekarang anggaplah ada program lain pada sistem yang juga disebut X.EXE tetapi diinstal dalam folder c:\windows\.

Apakah mungkin untuk dengan cepat mengetahui dari baris perintah bahwa jika saya mengetik di X.EXEmana dari keduanya X.EXEakan diluncurkan? (tetapi tanpa harus mencari atau melihat detail proses di Task Manager).

Mungkin semacam perintah built-in, atau beberapa program di luar sana yang dapat melakukan sesuatu seperti ini? :

detect_program_path X.EXE
Zabba
sumber
2
Kemungkinan duplikat dari Apakah ada padanan 'yang' pada baris perintah Windows?
Michael Freidgeim

Jawaban:

239

Gunakan whereperintah. Hasil pertama dalam daftar adalah yang akan dieksekusi.

C: \> di mana notepad
C: \ Windows \ System32 \ notepad.exe
C: \ Windows \ notepad.exe

Menurut posting blog ini , where.exedisertakan dengan Windows Server 2003 dan yang lebih baru, jadi ini hanya bekerja dengan Vista, Win 7, et al.

Di Linux, padanannya adalah whichperintah, mis which ssh.

Chris Schmich
sumber
2
+1! Saya tidak pernah tahu ini bisa menjadi bagian dari Windows dan jadi tidak melihat ke arah itu! :)
Zabba
1
Adakah yang setara untuk pengguna xp yang buruk?
shahar_m
@shahar_m: apakah Anda mencoba skrip di bawah ini dari Michael Burr? Ini bukan bawaan, tetapi mungkin melakukan apa yang Anda butuhkan.
Chris Schmich
1
@Kenny: Dengan asumsi Anda tahu nama DLL, Anda dapat menggunakan ListDLLs utilitas ( technet.microsoft.com/en-us/sysinternals/bb896656 ). Dari baris perintah, jalankan listdlls -d foo.dlluntuk melihat semua proses yang memiliki modul dimuat dan path lengkap ke modul dimuat. Atau, Anda bisa melakukan pencarian file Windows untuk nama file.
Chris Schmich
2
@ Kenny: Apa yang Anda minta sangat berbeda dari jawaban yang diposting di sini. Anda harus membuat pertanyaan Stack Overflow baru dengan penelitian apa yang telah Anda lakukan dan memposting tautan ke sana di komentar ini.
Chris Schmich
10

Berikut ini adalah skrip cmd kecil yang dapat Anda salin-tempel ke dalam file bernama sesuatu seperti where.cmd:

@echo off
rem - search for the given file in the directories specified by the path, and display the first match
rem
rem    The main ideas for this script were taken from Raymond Chen's blog:
rem
rem         http://blogs.msdn.com/b/oldnewthing/archive/2005/01/20/357225.asp
rem
rem
rem - it'll be nice to at some point extend this so it won't stop on the first match. That'll
rem     help diagnose situations with a conflict of some sort.
rem

setlocal

rem - search the current directory as well as those in the path
set PATHLIST=.;%PATH%
set EXTLIST=%PATHEXT%

if not "%EXTLIST%" == "" goto :extlist_ok
set EXTLIST=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
:extlist_ok

rem - first look for the file as given (not adding extensions)
for %%i in (%1) do if NOT "%%~$PATHLIST:i"=="" echo %%~$PATHLIST:i

rem - now look for the file adding extensions from the EXTLIST
for %%e in (%EXTLIST%) do @for %%i in (%1%%e) do if NOT "%%~$PATHLIST:i"=="" echo %%~$PATHLIST:i
Michael Burr
sumber
8

Seperti utas yang disebutkan dalam komentar, get-commanddi PowerShell juga bisa menyelesaikannya. Misalnya, Anda bisa mengetik get-command npmdan outputnya seperti di bawah ini:

masukkan deskripsi gambar di sini

Eugene
sumber
(get-command npm).Sourceakan merespons hanya dengan jalur ke npm (sebagai contoh) alih-alih seluruh tabel dari semua properti.
David Brown