Frage Gibt es in der Windows-Befehlszeile ein Äquivalent zu "which"?


Da ich manchmal Pfadprobleme habe, wo eines meiner eigenen cmd-Skripte von einem anderen Programm (früher auf dem Pfad) versteckt (shadowed) wird, würde ich gerne in der Lage sein, den vollständigen Pfad zu einem Programm in der Windows-Befehlszeile zu finden nur sein Name.

Gibt es ein Äquivalent zum UNIX-Befehl 'which'?

Unter UNIX which command Gibt den vollständigen Pfad des angegebenen Befehls aus, um diese Schattenprobleme problemlos zu finden und zu beheben.


1896
2017-11-20 04:19


Ursprung


Antworten:


Windows Server 2003 und höher (d. H. Alles nach Windows XP 32 Bit) bieten die where.exe Programm, das etwas von was macht which tut es, obwohl es mit allen Arten von Dateien übereinstimmt, nicht nur mit ausführbaren Befehlen. (Es passt nicht zu integrierten Shell-Befehlen wie cd.) Es wird sogar Wildcards akzeptieren, also where nt* findet alle Dateien in Ihrem %PATH% und aktuelles Verzeichnis, dessen Namen mit beginnen nt.

Versuchen where /? für Hilfe.

Beachten Sie, dass Windows PowerShell definiert where als Alias ​​für das Where-Object Cmdlet, also wenn du willst where.exe, müssen Sie den vollständigen Namen eingeben, anstatt den .exe Erweiterung.


2103
2017-11-20 05:52



Während neuere Versionen von Windows haben a where können Sie dies auch mit Windows XP tun, indem Sie wie folgt die Modifizierer für Umgebungsvariablen verwenden:

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

Sie benötigen keine zusätzlichen Tools und sind nicht darauf beschränkt PATH da Sie eine beliebige Umgebungsvariable (natürlich im Pfadformat), die Sie verwenden möchten, ersetzen können.


Und wenn Sie einen haben wollen, der alle Erweiterungen in PATHEXT verarbeiten kann (wie Windows selbst), macht dieser den Trick:

@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

Es gibt tatsächlich alle Möglichkeiten zurück, aber Sie können es sehr leicht für bestimmte Suchregeln zwicken.


256
2017-11-20 05:48



Unter PowerShell get-command findet ausführbare Dateien überall in $Env:PATH.

get-command eventvwr

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

Es findet auch PowerShell-Cmdlets, Funktionen, Aliase, Dateien mit benutzerdefinierten ausführbaren Erweiterungen über $Env:PATHEXTusw. für die aktuelle Shell definiert (ganz ähnlich wie bei bash) type -a foo) - es besser machen als andere Tools where.exe, which.exeusw., die diese PowerShell-Befehle nicht kennen.

Sie können schnell einen Alias ​​mit einrichten sal which gcm (Kurzform von set-alias which get-command).


105
2017-11-26 02:07



In Windows-Powershell:

set-alias which where.exe

39
2017-11-30 23:00



Wenn Sie PowerShell installiert haben (was ich empfehle), können Sie den folgenden Befehl als grobe Entsprechung verwenden (ersetzen Sie Programmname für den Namen der ausführbaren Datei):

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

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


37
2017-11-20 05:16



Das GnuWin32 Werkzeuge haben whichzusammen mit einer ganzen Reihe anderer Unix-Tools.


31
2017-11-20 06:44



In Windows CMD which Anrufe where:

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

19
2018-04-01 12:02



Überrascht, dass niemand es erwähnt hat Cygwin als Lösung noch. Wenn es Ihnen nichts ausmacht, eine Lösung von Drittanbietern zu verwenden, dann ist Cygwin der richtige Weg.

Cygwin gibt Ihnen den Komfort von * nix in der Windows-Umgebung (und Sie können es in Ihrer Windows-Befehlsshell verwenden, oder verwenden Sie eine * nix-Shell Ihrer Wahl). Es gibt Ihnen eine ganze Reihe von * nix Befehlen (wie which) für Windows, und Sie können dieses Verzeichnis einfach in Ihr Verzeichnis einfügen PATH.


15
2017-10-12 17:02



In PowerShell ist es gcm, die formatierte Informationen über andere Befehle gibt. Wenn Sie nur den Pfad zur ausführbaren Datei abrufen möchten, verwenden Sie .Source.

Zum Beispiel: gcm git oder (gcm git).Source

Leckerbissen:

  • Verfügbar für Windows XP.
  • Verfügbar seit PowerShell 1.0.
  • gcm ist ein Alias ​​von Get-Command Cmdlet.
  • Ohne irgendwelche Parameter listet es alle verfügbaren Befehle auf, die von der Host-Shell angeboten werden.
  • Sie können einen benutzerdefinierten Alias ​​mit erstellen Set-Alias which gcm und benutze es wie: (which git).Source.
  • Offizielle Dokumente: https://technet.microsoft.com/en-us/library/ee176842.aspx

11
2017-09-11 11:32



Geht von hier aus Unxutils: http://sourceforge.net/projects/unxutils/

Gold auf Windows-Plattformen, setzt alle netten Unix-Utilities auf ein Standard-Windows-DOS. Benutze es seit Jahren.

Es hat ein "was" beinhaltet. Beachten Sie, dass es Groß- und Kleinschreibung ist.

NB: um es zu installieren, explodieren Sie die Zip irgendwo und fügen Sie ... \ UnxUtils \ usr \ local \ wbin \ zu Ihrer Systempfad-env-Variable hinzu.


8
2018-03-26 00:08



Ich habe in meinem PowerShell-Profil eine Funktion namens "which"

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

So sieht die Ausgabe aus:

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:

7
2017-07-31 08:59