Apakah ada yang setara dengan 'yang' pada baris perintah Windows?

2352

Karena saya kadang-kadang memiliki masalah jalur, di mana salah satu skrip cmd saya disembunyikan (dibayangi) oleh program lain (sebelumnya di jalur), saya ingin dapat menemukan path lengkap ke program pada baris perintah Windows, mengingat hanya namanya saja.

Apakah ada yang setara dengan perintah UNIX 'yang'?

Pada UNIX, which commandmencetak path lengkap dari perintah yang diberikan untuk dengan mudah menemukan dan memperbaiki masalah bayangan ini.

namin
sumber
3
Foredecker: "which" mencari PATH untuk dieksekusi yang akan dijalankan jika Anda mengetik perintah di prompt shell.
Greg Hewgill
3
misalnya, jika Anda memiliki 5 versi Java yang diinstal dan Anda tidak tahu mana yang sedang digunakan, Anda dapat mengetik "java mana" dan itu memberi Anda PATH ke biner
ninesided
9
@Foredecker, MR mengatakan "di mana" di Win2k3 tetapi Win2k3 bukan bagian dari pertanyaan. Jika "di mana" tidak ada dalam versi Windows lainnya, jawaban lain juga valid. IMNSHO, jawaban yang berfungsi pada semua versi Windows adalah yang terbaik. Juga, jawaban lain tidak salah, hanya cara yang berbeda untuk melakukannya.
paxdiablo
36
Saya tahu pertanyaan ini muncul sebelum SuperUser, tetapi mungkin ada di sana.
palswim
16
Tidak ada whichperintah di Unix standar. Utilitas POSIX adalah type. C Shell memiliki perintah yang mana, dan beberapa sistem memilikinya sebagai executable eksternal. Misalnya, di Debian Linux, whichberasal dari paket yang disebut debutils. Eksternal whichini tidak "melihat" shell built-in, alias atau fungsi. typetidak; Bash's typememiliki opsi untuk menekan itu dan hanya melakukan pencarian path.
Kaz

Jawaban:

2551

Windows Server 2003 dan yang lebih baru (yaitu apa saja setelah Windows XP 32 bit) menyediakan where.exeprogram yang melakukan beberapa hal which, meskipun cocok dengan semua jenis file, bukan hanya perintah yang dapat dieksekusi. (Ini tidak cocok dengan perintah shell built-in seperti cd.) Ia bahkan akan menerima wildcard, jadi where nt*temukan semua file di %PATH%direktori Anda dan saat ini yang namanya dimulai dengan nt.

Cobalah where /?minta bantuan.

Perhatikan bahwa Windows PowerShell mendefinisikan wheresebagai alias untuk yang Where-Objectcmdlet , jadi jika Anda ingin where.exe, Anda perlu mengetik nama lengkap bukan menghilangkan .exeekstensi.

Michael Ratanapintha
sumber
30
Tidak, karena grep memeriksa isi inputnya, yang harus Anda berikan secara eksplisit. yang dan di mana.exe hanya melihat nama - nama file dalam satu set direktori yang ditetapkan dalam variabel lingkungan PATH.
Michael Ratanapintha
12
@ Ajedi32 - Benar, yang tidak ada di XP. Seperti yang saya katakan, "Windows Server 2003 dan yang lebih baru".
Michael Ratanapintha
24
Bekerja di Windows 8
rob
57
hati-hati bahwa ini tidak akan bekerja di powershell kecuali Anda mengetik where.exe
JonnyRaa
17
Ingat itu where.exebukan shell builtin, Anda harus memiliki %windir%\system32pada Anda %PATH%- yang mungkin tidak terjadi, karena menggunakan wheremenunjukkan bahwa Anda mungkin sedang mengerjakan masalah dengan jalan Anda!
Tomasz Gandor
288

Sementara versi Windows yang lebih baru memiliki whereperintah, Anda juga dapat melakukan ini dengan Windows XP dengan menggunakan pengubah variabel lingkungan, sebagai berikut:

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

Anda tidak memerlukan alat tambahan apa pun dan itu tidak terbatas PATHkarena Anda dapat mengganti variabel lingkungan apa pun (dalam format jalur, tentu saja) yang ingin Anda gunakan.


Dan, jika Anda menginginkannya yang dapat menangani semua ekstensi di PATHEXT (seperti halnya Windows itu sendiri), yang ini berguna:

@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

Sebenarnya mengembalikan semua kemungkinan tetapi Anda dapat men-tweak dengan mudah untuk aturan pencarian tertentu.

paxdiablo
sumber
7
Hei, kuharap aku tahu itu! Sayang sekali itu tidak bekerja dengan MS-DOS atau Win9x (yaitu, dengan command.com). (Raymond Chen memiliki versi yang lebih "rumit" yang dapat Anda
ubah
110
@ Michael, jika Anda masih menggunakan DOS atau Win95, menemukan executable di jalan adalah sedikit dari masalah Anda :-)
paxdiablo
windows mengenali lebih dari .exe sebagai executable. Terakhir kali saya mengkodekan whichkembali dalam W95 / DOS hari amdittedly, urutan pencarian adalah - dir saat ini, lalu setiap path path, untuk cmd.com, lalu cmd.exe, lalu cmd.bat Jadi, bahkan cmd.bat di dir saat ini adalah dieksekusi befroe cmd.exe soemwhere di jalan
Mawg mengatakan mengembalikan Monica
3
@ mawg, dokumen asli adalah untuk tempat Anda mengetahui ekstensi karena ia mencerminkan mana di bawah UNIX (di mana tipu-ekstensi tidak muncul). Saya sekarang telah menambahkan satu yang dapat melakukan apa yang Anda inginkan, tetapi itu bukan lagi perintah sederhana seperti skrip. Pertama kali mencoba perintah tanpa hiasan lalu masing-masing ekstensi. Semoga itu bisa membantu. Anda dapat menyesuaikannya dengan kebutuhan Anda sesuai keinginan Anda (jika Anda ingin urutan pencarian yang sama seperti Windows misalnya - ini menunjukkan semua kemungkinan).
paxdiablo
2
Untuk mengubahnya menjadi skrip batch, buat file bernama "which.bat": @echo off for %%i in (%1) do @echo. %%~$PATH:%i Untuk menambahkannya ke skrip alias.bat yang Anda muat setiap kali Anda menjalankan cmd.exe (letakkan skrip di atas dalam direktori baru bernama C: \ usr \ aliases): DOSKEY which=C:\usr\aliases\which.bat $* Kemudian Anda dapat membuat skrip untuk meluncurkan cmd.exe dengan file alias.bat: cmd.exe /K E:\usr\aliases\alias.bat
Brad T.
152

Di bawah PowerShell, Get-Commandakan menemukan executable di mana saja di $Env:PATH.

Get-Command eventvwr

CommandType   Name          Definition
-----------   ----          ----------
Application   eventvwr.exe  c:\windows\system32\eventvwr.exe
Application   eventvwr.msc  c:\windows\system32\eventvwr.msc

Ia juga menemukan cmdlet PowerShell, fungsi, alias, file dengan ekstensi kustom yang dapat dieksekusi via $Env:PATHEXT, dll. Didefinisikan untuk shell saat ini (sangat mirip dengan Bash type -a foo) - membuatnya lebih baik daripada alat-alat lain seperti where.exe,which.exe , dll yang tidak menyadari ini Perintah PowerShell.

Menemukan executable hanya menggunakan sebagian dari nama

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

Menemukan custom executable

Untuk menemukan executable non-windows lainnya (python, ruby, perl, dll), ekstensi file untuk executable tersebut perlu ditambahkan ke PATHEXTvariabel lingkungan (default ke .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL) untuk mengidentifikasi file dengan ekstensi ini di PATHsebagai executable. Seperti Get-Commandjuga menghormati variabel ini, itu dapat diperluas ke daftar executable kustom. misalnya

$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

Anda dapat dengan cepat mengatur alias dengan sal which gcm(bentuk pendek dariset-alias which get-command ).

Informasi dan contoh lebih lanjut dapat ditemukan di bawah bantuan online untuk Get-Command.

shalomb
sumber
2
Ia menemukan lebih dari sekedar executable. Itu juga menangkap file perintah
Maximilian Burszley
2
@ TheIncorrigible1 - jika Anda maksud file perintah seperti file batch ( .BAT,, .CMDdll), mereka dianggap dapat dieksekusi karena ekstensi mereka dinamai dalam PATHEXTvariabel (yang secara default adalah PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL). Jenis yang dapat dieksekusi lainnya (mis .py. .rb, Dll) dapat ditambahkan dengan menambahkan ekstensi file dan menciptakan asosiasi yang dapat dieksekusi dengan assoc/ ftype- mis. Docs.python.org/3.3/using/…
shalomb
59

Di Windows PowerShell:

set-alias which where.exe
cmcginty
sumber
40

Jika Anda telah menginstal PowerShell (yang saya sarankan), Anda dapat menggunakan perintah berikut ini sebagai setara kasar (gantilah nama program untuk nama yang dapat dieksekusi):

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

Lebih banyak di sini: My Manwich! PowerShell Yang

RexE
sumber
1
Saya sedang mencari perintah powershell bernas tepat ini. Saya telah menggunakan where.exe tetapi harus dipusingkan dengan kode kesalahan di atas parsing outputnya jauh lebih rendah daripada solusi PowerShell asli. Terima kasih!
scobi
9
Tetapi ($Env:Path).Split(";") | Get-ChildItem -filter programName*sangat mudah untuk mengetik ... ;-)
Craig
Ini juga gagal jika Anda memiliki variabel di jalur Anda yang biasanya diselesaikan oleh sistem (alias% JAVA_HOME%).
dragon788
Saya tidak bisa mendapatkan yang.exe berfungsi, saya mencoba ini dan berhasil.
Asfand Qazi
37

Perangkat GnuWin32 memiliki which, bersama dengan banyak alat Unix lainnya.

Ferruccio
sumber
24

Dalam whichpanggilan CMD Windows where:

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

Cygwin adalah solusi. Jika Anda tidak keberatan menggunakan solusi pihak ketiga, maka Cygwin adalah cara untuk pergi.

Cygwin memberi Anda kenyamanan * nix di lingkungan Windows (dan Anda dapat menggunakannya di shell perintah Windows Anda, atau menggunakan shell * nix pilihan Anda). Ini memberi Anda sejumlah besar perintah * nix (seperti which) untuk Windows, dan Anda bisa saja memasukkan direktori itu di PATH.

palswim
sumber
10
GnuWin32 yang disebutkan sebelumnya oleh Ferruccio jauh lebih baik dalam hal ini karena Anda dapat memiliki asli di mana dapat dieksekusi sendiri.
Piotr Dobrogost
GnuWin32 hebat, dan saya menggunakannya, tetapi jika Anda ingin fungsionalitas ini tanpa menginstal alat GnuWin32 ,.exe sepertinya merupakan panggilan yang tepat. Meskipun demikian, saya meletakkan alat GnuWin32 di \ bin $ share di jaringan kami sehingga saya dapat menggunakannya dari workstation (dan dalam file batch) yang tidak diinstal secara lokal.
Craig
1
Ketika kita berbicara tentang penggunaan Cygwin di Windows, saya lebih suka: cygpath -w "` yang <appname> `"
mpasko256
12

Di PowerShell, gcmyang memberikan informasi yang diformat tentang perintah lain. Jika Anda ingin mengambil hanya path ke executable, gunakan.Source .

Misalnya: gcm gitatau(gcm git).Source

Informasi:

gagak vulcan
sumber
11

Saya memiliki fungsi di profil PowerShell saya bernama 'which'

function which {
    get-command $args[0]| format-list
}

Seperti inilah hasilnya:

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:
Fez
sumber
Tidak ada solusi lain yang bekerja untuk saya tetapi > get-command app.exe | format-listbekerja dengan sempurna!
Alexander McFarlane
10

Dapatkan unxutils dari sini: http://sourceforge.net/projects/unxutils/

emas pada platform windows, menempatkan semua utilitas unix yang bagus pada DOS windows standar. Sudah menggunakannya selama bertahun-tahun.

Ini memiliki 'yang' disertakan. Perhatikan bahwa case case sensitif.

NB: untuk menginstalnya meledak zip di suatu tempat dan tambahkan ... \ UnxUtils \ usr \ local \ wbin \ ke jalur sistem Anda env variabel.

Jon Court
sumber
2
itu tidak peka huruf besar kecil, juga saya harus mengatakan yang java.exe bukan yang java - windows 7
Kalpesh Soni
Ini memiliki beberapa frustrasi meskipun berkaitan dengan baris baru; grep misalnya tidak akan cocok dengan EOL tanpa Anda memasukkan dalam .untuk. Ini adalah solusi 99% yang pasti!
dash-tom-bang
Ya, ini tidak peka terhadap huruf besar-kecil, namun secara default nama file di Windows juga tidak peka terhadap huruf besar-kecil.
Wernfried Domscheit
8

Tidak dalam saham Windows tapi disediakan oleh Layanan untuk Unix dan ada beberapa script sederhana batch yang mengambang di sekitar yang mencapai hal yang sama seperti ini yang satu ini .

Robert Gamble
sumber
1
Kecuali bahwa perintah yang Anda tautkan hanya menampilkan variabel PATH dan bahkan tidak memeriksa apakah file tersebut ditemukan di sana.
Angel O'Sphere
8

Jika Anda dapat menemukan kompilator Pascal gratis, Anda dapat mengkompilasi ini. Setidaknya itu berfungsi dan menunjukkan algoritma yang diperlukan.

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.
Mawg berkata mengembalikan Monica
sumber
21
Wow, masih ada orang yang menggunakan Pascal? :-)
paxdiablo
6
Saya membayangkan ada. Tapi bukan aku. Apakah Anda melihat baris program_date = '17 Maret 1994 ';
Mawg mengatakan mengembalikan Monica
1
Unit my_funk;tidak perlu. Terima kasih telah memposting program Pascal, mengingatkan saya pada masa muda saya! Sangat disayangkan bahwa Pascal tidak berevolusi.
yannis
2
Oh, tapi ternyata berhasil. Sekarang berorientasi objek, misalnya. Ada platform, implementasi, dan IDE gratis yang hebat di lazarus-ide.org Dan keturunan langsung Borland masih tinggal di Delphi di embarcadero.com/products/delphi yang sangat mahal (imo) dengan harga $ 299 untuk edisi pemula dan $ 1rb untuk edisi "dapat digunakan". Namun, itu adalah lintas platform - windows, iOs, Mac, Android. Dapatkan edisi uji coba atau gunakan Lazarus dan rasakan 20 tahun lebih muda, -)
Mawg mengatakan pulihkan Monica
1
@yannis "Sayang sekali bahwa Pascal tidak berevolusi" ... terlepas dari 'Turbo Pascal' Anders akan merancang C # maksudmu?
piers7
7

Versi terbaik dari ini yang saya temukan di Windows adalah utilitas "whereis" Joseph Newcomer, yang tersedia (dengan sumber) dari situsnya .

Artikel tentang pengembangan "whereis" layak dibaca.

Tim Lesher
sumber
1
Komentar terakhir: whereis memiliki masalah untuk menemukan executable 64-bit di bawah Win 7 64-bit.
Axel Kemper
7

Pertama-tama Anda dapat menginstal Git dari Mengunduh Git , dan kemudian buka Git Bash dan ketik:

which app-name
hamidreza samsami
sumber
6

Tidak satu pun dari port Win32 Unix yang dapat saya temukan di Internet memuaskan, karena mereka semua memiliki satu atau lebih dari kekurangan ini:

  • Tidak ada dukungan untuk variabel Windows PATHEXT. (Yang mendefinisikan daftar ekstensi yang ditambahkan secara implisit ke setiap perintah sebelum memindai jalur, dan dalam urutan yang mana.) (Saya menggunakan banyak skrip tcl, dan tidak tersedia untuk umum alat apa yang dapat menemukannya.)
  • Tidak ada dukungan untuk halaman kode cmd.exe, yang membuatnya menampilkan jalur dengan karakter non-ascii salah. (Saya sangat sensitif terhadap itu, dengan ç dalam nama depan saya :-))
  • Tidak ada dukungan untuk aturan pencarian berbeda di cmd.exe dan baris perintah PowerShell. (Tidak ada alat yang tersedia untuk umum akan menemukan skrip .ps1 di jendela PowerShell, tetapi tidak di jendela cmd!)

Jadi saya akhirnya menulis sendiri, yang mendukung semua hal di atas dengan benar.

Tersedia di sana: http://jf.larvoire.free.fr/progs/which.exe

Jean-François Larvoire
sumber
FYI Saya sudah open-source alat which.exe saya yang disebutkan di atas, dan banyak lainnya, di github.com/JFLarvoire/SysToolsLib . Anda bisa mendapatkan versi terbaru di sana, melaporkan masalah, dll.
Jean-François Larvoire
6

File batch ini menggunakan penanganan variabel CMD untuk menemukan perintah yang akan dieksekusi di path. Catatan: direktori saat ini selalu dilakukan sebelum path) dan tergantung pada panggilan API mana yang digunakan, lokasi lain dicari sebelum / setelah path.

@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%)

Lihat set /?bantuan.


sumber
6

Saya menggunakan GOW (GNU pada Windows) yang merupakan versi ringan dari Cygwin. Anda dapat mengambilnya dari GitHub di sini .

GOW (GNU pada Windows) adalah alternatif ringan untuk Cygwin. Ia menggunakan penginstal Windows yang nyaman yang menginstal sekitar 130 aplikasi UNIX open source yang sangat berguna dikompilasi sebagai binari win32 asli. Ini dirancang untuk menjadi sekecil mungkin, sekitar 10 MB, berbeda dengan Cygwin yang dapat berjalan lebih dari 100 MB tergantung pada opsi. - Tentang Keterangan (Brent R. Matzelle)

Tangkapan layar daftar perintah yang termasuk dalam GOW:

Masukkan deskripsi gambar di sini

Prayson W. Daniel
sumber
5

Saya telah membuat alat yang mirip dengan Ned Batchelder:

Mencari file .dll dan .exe di PATH

Sementara alat saya terutama untuk mencari berbagai versi dll itu menunjukkan lebih banyak info (tanggal, ukuran, versi) tetapi tidak menggunakan PATHEXT (Saya berharap untuk memperbarui alat saya segera).

Michał Niklas
sumber
5

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.

bobbogo
sumber
2
Lebih suka itu dalam beberapa baris sehingga saya bisa memahaminya. ;-)
Gringo Suave
4

Untuk Anda pengguna Windows XP (yang tidak memiliki whereperintah bawaan), saya telah menulis perintah "di mana suka" sebagai rubygem yang disebutwhichr .

Untuk menginstalnya, instal Ruby.

Kemudian

gem install whichr

Jalankan seperti:

C:> whichr cmd_di sini

rogerdpack
sumber
3
Saya menduga Anda sedang downvoted karena Anda menyarankan untuk melakukan sesuatu pada Windows XP.
sebastian-c
1
Tidak downvote tetapi menginstal Ruby untuk mengimplementasikan perintah sepele juga sulit dijual. Ada loop untuk di atas yang bisa dimasukkan ke dalam skrip batch.
Gringo Suave
2
Apakah itu mencetak garis pembuka ke lagu tema untuk The Witcher jika Anda menjalankannya dalam mode verbose? ;)
Agi Hammerthief
3

TCC dan TCC / LE dari JPSoft adalah pengganti CMD.EXE yang menambahkan fungsionalitas yang signifikan. Relevan dengan pertanyaan OP, whichadalah perintah bawaan untuk prosesor perintah keluarga TCC.

David G
sumber
2

Saya telah menggunakan whichmodul dari npm cukup lama, dan itu bekerja dengan sangat baik: https://www.npmjs.com/package/which Ini adalah alternatif multi platform yang hebat.

Sekarang saya beralih ke whichyang datang dengan Git. Tambahkan saja path Anda /usr/binpath dari Git, yang biasanya di C:\Program Files\Git\usr\bin\which.exe. The whichbiner akan berada di C:\Program Files\Git\usr\bin\which.exe. Lebih cepat dan juga berfungsi seperti yang diharapkan.

Giovanni Bassi
sumber
1

coba ini

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

sumber