Soru Windows komut satırında 'hangisi' var?


Bazen kendi cmd komut dosyalarından birinin başka bir program tarafından (gölgeli) gizlendiği yol sorunlarına sahip olduğum için, Windows komut satırında bir programın tam yolunu bulmak istiyorum. sadece ismi.

UNIX komutuna 'hangi' eşdeğer var mı?

UNIX'te which command Bu gölgeleme sorunlarını kolayca bulmak ve onarmak için verilen komutun tam yolunu yazdırır.


1900
2017-11-20 04:19


Menşei


Foredecker: "komut", komut istemine bir komut yazdığınızda çalıştırılacak olan yürütülebilir dosyanın PATH'sini arar. - Greg Hewgill
Örneğin, Java'nın 5 sürümü yüklüyse ve hangisinin kullanılmakta olduğunu bilmiyorsanız, "hangi java" yazabilir ve size ikili için PATH verir - ninesided
@Foredecker, MR, Win2k3'te "nerede" olduğunu, ancak Win2k3'ün sorunun bir parçası olmadığını söylüyor. Diğer Windows sürümlerinde "nerede" yoksa, diğer cevaplar da geçerlidir. IMNSHO, tüm Windows sürümlerinde çalışan cevap en iyisidir. Ayrıca, diğer cevaplar yanlış değil, sadece bunu yapmanın farklı yolları. - paxdiablo
Bu soruyu SuperUser'dan önce biliyorum, ama muhtemelen oraya ait. - palswim
Yok which standart Unix'te komut. POSIX yardımcı programı type. C Kabuğunun hangi komutu vardır ve bazı sistemler harici bir yürütülebilir dosya olarak var. Örneğin, Debian Linux’ta which adında bir paketten geliyor debutils. Bu harici which kabuk yerleşik, takma ad ve işlevlerini "görmez". type yapar; Bash en type bunu bastırmak ve sadece bir yol araması yapmak için bir seçeneğe sahiptir. - Kaz


Cevaplar:


Windows Server 2003 ve sonrası (yani, Windows XP 32 bit'ten sonra herhangi bir şey) where.exe bazı şeyleri yapan program which her ne kadar sadece yürütülebilir komutlarla değil, her tür dosyayla eşleşir. (Bu gibi yerleşik kabuk komutları eşleşmiyor cd.) Joker karakterleri bile kabul eder where nt* içindeki tüm dosyaları bulur %PATH% ve adları ile başlayan geçerli dizin nt.

Deneyin where /? yardım için.

Windows PowerShell'in tanımladığını unutmayın. where takma ad olarak Where-Object cmdleteğer istersen where.exe, atlamak yerine tam adı yazmanız gerekir .exe uzantı.


2107
2017-11-20 05:52



Hayır çünkü grep inceliyor içindekiler açıkça vermeniz gereken girdinin. hangi ve where.exe sadece bak isimler PATH ortam değişkenlerinde ayarlanan dizin kümesindeki dosyaların. - Michael Ratanapintha
@ Ajedi32 - Doğru, hangi XP'de değil. Dediğim gibi, "Windows Server 2003 ve sonrası". - Michael Ratanapintha
Windows 8'de çalışır - rob
buna dikkat et Powershell'de çalışma where.exe yazmazsanız - Jonny Leeds
Bunu hatırla where.exe bir kabuk yerleşik değil, sahip olmanız gerekir %windir%\system32 senin üstünde %PATH% - Kullanılmadığı gibi durum böyle olmayabilir where yolunuzla ilgili problemler üzerinde çalışıyor olabileceğinizi öne sürüyor! - Tomasz Gandor


Windows'un sonraki sürümlerinde bir where komutu, bunu Windows XP'de ortam değişkeni değiştiricileri kullanarak aşağıdaki gibi yapabilirsiniz:

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

Ekstra herhangi bir araca ihtiyacınız yoktur ve bunlarla sınırlı değildir. PATH Çünkü kullanmak istediğiniz herhangi bir ortam değişkeni (tabii ki yol biçiminde) kullanabilirsiniz.


Ve eğer PATHEXT'deki (Windows'un kendisi gibi) tüm uzantıların üstesinden gelebilecek birini istiyorsanız, bu bir hile yapar:

@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

Aslında tüm olasılıkları döndürür, ancak belirli arama kuralları için kolayca düzenleyebilirsiniz.


257
2017-11-20 05:48



Hey, keşke bunu öğrenmiş olsaydım! Çok kötü, MS-DOS veya Win9x ile çalışmıyor (yani, komut.com ile). (Raymond Chen'in bir "batch" dosyasına dönüştürebilecek daha "ayrıntılı" bir sürümü var: blogs.msdn.com/oldnewthing/archive/2005/01/20/357225.aspx ) - Michael Ratanapintha
@Michael, hala DOS veya Win95 kullanıyorsanız, yolda yürütülebilir dosyaları bulmak en az senin sorunların :-) - paxdiablo
Windows, .exe'den fazla çalıştırılabilir olarak tanır. Son kez bir kod yazdım which W95 / DOS günlerde amdittedly, arama sırası oldu - geçerli dir, sonra her yol dir, cmd.com, sonra cmd.exe, sonra cmd.bat Yani, hatta geçerli dir cmd.bat befroe cmd.exe çalıştırılır yoldaki yer - Mawg
@mawg, orijinal, uzantıyı bildiğiniz yerdeydi çünkü UNIX altında hangi uzantıların eklenmediğini yansıtır. Şimdi istediğini yapabilecek birini ekledim ama artık bir komut dosyası kadar basit bir komut değil. İlk önce, kullanılmayan komutu ve ardından uzantıların her birini dener. Umarım yardımcı olur. Size uygun gördüğünüz gibi ihtiyaçlarınıza göre ayarlayabilirsiniz (örneğin, Windows'da olduğu gibi aynı arama sırasını istiyorsanız - bu, tüm olasılıkları gösterir). - paxdiablo
Bunu bir toplu iş dosyasına dönüştürmek için "which.bat" adında bir dosya oluşturun: @echo off for %%i in (%1) do @echo. %%~$PATH:%i  Cmd.exe'yi çalıştırdığınız her zaman yüklediğiniz bir alias.bat komut dosyasına eklemek için (yukarıdaki betiği C: \ usr \ aliases adlı yeni bir dizine koyun): DOSKEY which=C:\usr\aliases\which.bat $*  Ardından, alias.bat dosyasıyla cmd.exe dosyasını başlatmak için bir komut dosyası hazırlayabilirsiniz: cmd.exe /K E:\usr\aliases\alias.bat - Brad T.


PowerShell Altında get-command her yerde yürütülebilir dosyaları bulacak $Env:PATH.

get-command eventvwr

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

Ayrıca, özel yürütme uzantılarına sahip powershell cmdlet'lerini, işlevlerini, diğer adlarını, dosyalarını bulur. $Env:PATHEXTMevcut kabuk için tanımlanmış vb. type -a foo) - diğer araçlar gibi daha iyi bir go-yapmak where.exe, which.exeBu PowerShell komutlarından habersiz vb.

İle bir takma ad oluşturabilirsiniz. sal which gcm (kısa formu set-alias which get-command).


105
2017-11-26 02:07





Windows powershell'de:

set-alias which where.exe

39
2017-11-30 23:00





Eğer kurulu PowerShell varsa (ki bunu tavsiye ederim), aşağıdaki komutu kaba eşdeğeri olarak kullanabilirsiniz (yürütülebilir dosyanın adı için ikame programAdı):

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

Daha fazla burada: http://www.codeassassin.com/blog/PermaLink,guid,fd1967d1-f844-4e29-82e2-f2d6424b4ef9.aspx


37
2017-11-20 05:16



Bu tam pithy powershell komutunu arıyordum. Where.exe kullanıyordum ama çıktı ayrıştırmak üstünde hata kodu ile uğraşmak zorunda olan bir yerel powershell çözümüne çok daha düşüktür. Teşekkürler! - scobi
PowerShell'iniz varsa, kullanmalısınız Get-Command. - jpmc26
Fakat ($Env:Path).Split(";") | Get-ChildItem -filter programName* yazmak çok kolay ... ;-) - Craig
Get-Command lehine indirme (üzgünüm @RexE) - piers7
Bu, normalde sistem tarafından çözülen bir değişkeni (aka% JAVA_HOME%) varsa, bu da başarısız olur. - dragon788


GnuWin32 araçlar var whichtüm diğer Unix araçlarıyla birlikte.


31
2017-11-20 06:44



İndirmek için bunu kullan sourceforge.net/projects/getgnuwin32/?source=dlp - Kalpesh Soni


Windows CMD'de which aramalar where:

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

19
2018-04-01 12:02





Kimsenin bahsetmediğine şaşırdım cygwin henüz bir çözüm olarak. Üçüncü taraf bir çözüm kullanmanın sakıncası yoksa, cygwin gitmenin yoludur.

Cygwin Windows ortamında * nix'in rahatlığını sunar (ve Windows komut kabuğunuzda kullanabilir veya istediğiniz bir * nix kabuğunu kullanabilirsiniz). Bu size * nix komutlarının tamamını sunar. which) Windows için, bu dizini PATH.


15
2017-10-12 17:02



Ferruccio'nun daha önce bahsettiği GnuWin32, bu durumda yerel olarak olabileceğinden çok daha iyi nerede tek başına çalıştırılabilir. - Piotr Dobrogost
GnuWin32 harika ve ben kullanıyorum, ancak GnuWin32 araçlarını yüklemeden bu işlevselliği istiyorsanız, where.exe doğru çağrı gibi görünüyor. Yine de, GnuWin32 araçlarını ağımızdaki bir \ bin $ paylaşımına koydum, böylece onları yerel olarak yüklememiş iş istasyonlarından (ve toplu iş dosyalarından) kullanabilirim. - Craig
Windows'da Cygwin kullanımı hakkında konuştuğumda, şunu tercih ederim: cygpath -w "` hangi <appname> `" - mpasko256