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



9 Answers

Während neuere Versionen von Windows einen where Befehl haben, können Sie dies auch mit Windows XP tun, indem Sie die Modifizierer für Umgebungsvariablen wie folgt 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 auf PATH beschränkt, da Sie jede Umgebungsvariable (natürlich im Pfadformat), die Sie verwenden möchten, ersetzen können.

Und wenn Sie einen haben wollen, der alle Erweiterungen in PATHEXT handhaben 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.

Question

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 gibt which command den vollständigen Pfad des angegebenen Befehls aus, um diese Schattenprobleme einfach zu finden und zu reparieren.




Holen Sie sich Unexuelle von hier: 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.




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

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







Keiner der Win32-Ports von Unix, die ich im Internet finden konnte, ist satistactory, weil sie alle einen oder mehrere dieser Unzulänglichkeiten haben:

  • Keine Unterstützung für Windows PATHEXT-Variable. (Dies definiert die Liste der implizit jedem Befehl hinzugefügten Erweiterungen vor dem Scannen des Pfades und in welcher Reihenfolge.) (Ich benutze viele tcl-Skripte und es ist nicht öffentlich verfügbar, welches Tool sie finden könnte.)
  • Keine Unterstützung für cmd.exe-Codepages, wodurch sie Pfade mit nicht-ASCII-Zeichen falsch anzeigen. (Ich bin sehr empfindlich darauf, mit dem ç in meinem Vornamen :-))
  • Keine Unterstützung für die verschiedenen Suchregeln in cmd.exe und der PowerShell-Befehlszeile. (Kein öffentlich verfügbares Tool findet .ps1-Skripte in einem PowerShell-Fenster, aber nicht in einem cmd-Fenster!)

Also habe ich irgendwann mein eigenes geschrieben, was das alles oben korrekt unterstützt.

Verfügbar dort: http://jf.larvoire.free.fr/progs/which.exe







In Windows-Powershell:

set-alias which where.exe



Ich verwende GOW (Gnu unter Windows), eine Light-Version von Cygwin. Sie können es von Github here. erfassen here.

Gow (Gnu On Windows) ist die leichte Alternative zu Cygwin. Es verwendet ein praktisches Windows-Installationsprogramm, das ungefähr 130 äußerst nützliche Open-Source-UNIX-Anwendungen installiert, die als native Win32-Binärdateien kompiliert sind. Es ist so klein wie möglich, etwa 10 MB, im Gegensatz zu Cygwin, die je nach Optionen weit über 100 MB laufen kann. - Über Beschreibung (Brent R. Matzelle)

Screenshot einer Liste von Befehlen, die in GOW enthalten sind.




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:



Die GnuWin32 Tools haben, zusammen mit einer ganzen Reihe anderer Unix-Tools.




Related