2808 Stimmen

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

Da ich manchmal Pfadprobleme habe, bei denen eines meiner eigenen cmd-Skripte von einem anderen Programm (das weiter oben im Pfad liegt) verdeckt (überschattet) wird, würde ich gerne den vollständigen Pfad zu einem Programm in der Windows-Befehlszeile finden können, wenn ich nur seinen Namen angeben kann.

Gibt es eine Entsprechung für den UNIX-Befehl 'which'?

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

0 Stimmen

Was bedeutet "welches" unter Unix?

3 Stimmen

Foredecker: "which" sucht im PATH nach der ausführbaren Datei, die ausgeführt wird, wenn Sie an der Shell-Eingabeaufforderung einen Befehl eingeben.

3 Stimmen

Wenn Sie z.B. 5 Versionen von Java installiert haben und nicht wissen, welche verwendet wird, können Sie "which java" eingeben und Sie erhalten den PATH zum Binary

2977voto

Michael Ratanapintha Punkte 38036

Windows Server 2003 und höher (d. h. alles nach Windows XP 32 Bit) bieten die where.exe Programm, das einiges von dem tut, was which tut, obwohl es alle Arten von Dateien findet, nicht nur ausführbare Befehle. (Es passt nicht zu eingebauten Shell-Befehlen wie cd .) Es werden sogar Platzhalter akzeptiert, also where nt* findet alle Dateien in Ihrem %PATH% und das aktuelle Verzeichnis, deren Namen mit nt .

Versuchen Sie where /? für Hilfe.

Beachten Sie, dass Windows PowerShell Folgendes definiert where als Alias für die Where-Object Cmdlet wenn Sie also wollen where.exe müssen Sie den vollständigen Namen eingeben, anstatt das .exe Erweiterung. Alternativ können Sie auch einen Alias dafür festlegen:

Set-Alias which where.exe

Aktualisierung: Verwendung von Get-Command (alias: gcm ) wird empfohlen, da es PS-eigen ist und alle Befehlstypen abrufen kann: Aliase, Cmdlets, ausführbare Dateien und Funktionen. Beispiel:

gcm notepad*

32 Stimmen

Nein, denn grep untersucht die Inhalt seiner Eingabe, die Sie ausdrücklich angeben müssen. die y wo.exe sehen nur die Namen der Dateien in einer Reihe von Verzeichnissen, die in den PATH-Umgebungsvariablen festgelegt sind.

12 Stimmen

@Ajedi32 - Richtig, die ist nicht in XP. Wie ich schon sagte: "Windows Server 2003 und später".

3 Stimmen

@MichaelRatanapintha Ja, aus irgendeinem Grund dachte ich, dass Windows Server 2003 vor Windows XP entwickelt wurde. Mann, XP ist alt...

317voto

paxdiablo Punkte 809679

Während spätere Versionen von Windows eine where können Sie dies unter Windows XP auch mit Hilfe der Umgebungsvariablenmodifikatoren wie folgt tun:

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 kein zusätzliches Werkzeug und sind nicht auf Folgendes beschränkt PATH da Sie jede Umgebungsvariable (natürlich im Pfadformat) ersetzen können, die Sie verwenden möchten.


Und wenn Sie ein Programm wollen, das mit allen Erweiterungen in PATHEXT umgehen kann (wie Windows selbst), ist dieses Programm genau das Richtige:

@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 werden eigentlich alle Möglichkeiten angezeigt, aber Sie können es ganz einfach für spezifische Suchregeln optimieren.

8 Stimmen

Hey, ich wünschte, ich hätte das gelernt! Schade, dass es nicht mit MS-DOS oder Win9x (d.h. mit command.com) funktioniert. (Raymond Chen hat eine "ausgefeiltere" Version, die Sie in eine Batch-Datei verwandeln können: blogs.msdn.com/oldnewthing/archive/2005/01/20/357225.aspx )

135 Stimmen

@Michael, wenn Sie noch DOS oder Win95 benutzen, sind die ausführbaren Dateien im Pfad die am wenigsten Ihrer Probleme :-)

0 Stimmen

Windows erkennt mehr als .exe als ausführbar. Das letzte Mal habe ich eine which in den W95/DOS-Tagen war die Suchreihenfolge - aktuelles Verzeichnis, dann jedes Pfadverzeichnis, für cmd.com, dann cmd.exe, dann cmd.bat Also wird sogar cmd.bat im aktuellen Verzeichnis vor cmd.exe irgendwo im Pfad ausgeführt

246voto

shalomb Punkte 3008

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

Und da man in der Powershell Aliase definieren kann, which kann folgendermaßen definiert werden.

$ sal which gcm   # short form of `Set-Alias which Get-Command`
$ which foo
...

PowerShell Befehle sind nicht nur ausführbare Dateien ( .exe , .ps1 usw.). Sie können auch Cmdlets, Funktionen, Aliase, benutzerdefinierte ausführbare Suffixe sein, die in $Env:PATHEXT , usw. Get-Command ist in der Lage, alle diese Befehle zu finden und aufzulisten (ähnlich wie Bashs type -a foo ). Dies allein macht es besser als where.exe , which.exe usw., die in der Regel darauf beschränkt sind, nur ausführbare Dateien zu finden.

Suche nach ausführbaren Dateien, die nur einen Teil des Namens enthalten

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

Suche nach benutzerdefinierten ausführbaren Dateien

Im Gegensatz zu UNIX, wo ausführbare Dateien mit der Bezeichnung "executable" ( +x ) gesetzt ist, sind ausführbare Dateien unter Windows Dateien, die sich in einem der Verzeichnisse befinden, die in der Datei $PATH Umgebungsvariable, deren Dateinamensuffixe in der $PATHEXT Umgebungsvariable (Standardwert ist .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL ).

Als Get-Command auch diese Umgebungsvariable beachtet, kann es erweitert werden, um benutzerdefinierte ausführbare Dateien aufzulisten. z.B.

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

Siehe Get-Command für weitere Optionen und Beispiele.

3 Stimmen

Es findet viel mehr als nur ausführbare Dateien. Er findet auch Befehlsdateien

2 Stimmen

@TheIncorrigible1 - wenn Sie meinen Befehlsdateien wie zum Beispiel Batch-Dateien ( .BAT , .CMD usw.), werden sie als ausführbar betrachtet, da ihre Erweiterungen in der Datei PATHEXT (die standardmäßig die Variable PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MS‌​C;.CPL ). Andere Typen von ausführbaren Dateien (z. B. .py , .rb usw.) können hinzugefügt werden, indem die Dateierweiterung hinzugefügt und eine ausführbare Verknüpfung mit assoc / ftype - z.B.. docs.python.org/3.3/using/

3 Stimmen

Da die ursprüngliche Antwort bereits 2008 veröffentlicht wurde, sollte sie jetzt, im Jahr 2020, ehrlich gesagt als beste Antwort ausgewählt werden. Die Zeiten haben sich geändert. PowerShell ist der Weg, vor allem, weil diese Antwort jetzt plattformübergreifend ist, wo immer PowerShell existiert.

70voto

cmcginty Punkte 106764

In Windows PowerShell:

set-alias which where.exe

45voto

RexE Punkte 16299

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

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

Mehr dazu finden Sie hier: Mein Manwich! PowerShell Welche

1 Stimmen

Ich habe nach genau diesem prägnanten Powershell-Befehl gesucht. Ich hatte where.exe verwendet, aber das Herumhantieren mit dem Fehlercode und das Parsen der Ausgabe ist einer nativen Powershell-Lösung weit unterlegen. Vielen Dank!

10 Stimmen

Pero ($Env:Path).Split(";") | Get-ChildItem -filter programName* ist so einfach zu tippen... ;-)

0 Stimmen

Dies schlägt auch fehl, wenn Sie eine Variable in Ihrem Pfad haben, die normalerweise vom System aufgelöst wird (aka %JAVA_HOME%).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X