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


2352

Da ich manchmal Pfadprobleme habe, bei denen eines meiner eigenen cmd-Skripte von einem anderen Programm (früher auf dem Pfad) ausgeblendet (beschattet) wird, möchte ich in der Windows-Befehlszeile den vollständigen Pfad zu einem Programm finden können nur sein Name.

Gibt es eine Entsprechung zum UNIX-Befehl 'which'?

Gibt unter UNIX which commandden vollständigen Pfad des angegebenen Befehls aus, um diese Schattenprobleme leicht zu finden und zu beheben.


3
Foredecker: "which" durchsucht den PATH nach der ausführbaren Datei, die ausgeführt wird, wenn Sie an der Shell-Eingabeaufforderung einen Befehl eingeben.
Greg Hewgill

3
wenn Sie zum Beispiel, haben 5 Versionen von Java installiert ist, und Sie wissen nicht , welche verwendet wird, können Sie „ die java“ eingeben und es gibt Ihnen den Pfad zu den binären
ninesided

9
@ Foredecker, MR sagt, es ist "wo" in Win2k3, aber Win2k3 war nicht Teil der Frage. Wenn "wo" nicht in den anderen Windows-Versionen enthalten ist, sind auch andere Antworten gültig. IMNSHO, die Antwort, die auf allen Windows-Versionen funktioniert, ist die beste. Auch die anderen Antworten sind nicht falsch, sondern nur verschiedene Methoden.
Paxdiablo

36
Ich weiß, dass diese Frage vor SuperUser gestellt wurde, aber sie gehört wahrscheinlich dorthin.
Palswim

16
whichIn Standard-Unix gibt es keinen Befehl. Das POSIX-Dienstprogramm ist type. Die C-Shell hat einen which-Befehl, und einige Systeme haben ihn als externe ausführbare Datei. Unter Debian Linux whichstammt es beispielsweise aus einem Paket namens debutils. Dieses Externe which"sieht" keine Shell-Integrationen, Aliase oder Funktionen. typetut; Bash's typehat die Option, dies zu unterdrücken und einfach eine Pfadsuche durchzuführen.
Kaz

Antworten:


2551

Windows Server 2003 und höher (dh alles nach Windows XP 32 Bit) bietet das where.exeProgramm, das einige Funktionen ausführt which, obwohl es allen Dateitypen entspricht, nicht nur ausführbaren Befehlen. (Es stimmt nicht mit integrierten Shell-Befehlen wie überein cd.) Es akzeptiert sogar Platzhalter, sodass where nt*alle Dateien in Ihrem %PATH%und dem aktuellen Verzeichnis gefunden werden, deren Namen mit beginnen nt.

Versuchen Sie where /?um Hilfe.

Beachten Sie, dass Windows PowerShell whereals Alias ​​für das Where-ObjectCmdlet definiert wird. Wenn Sie möchten where.exe, müssen Sie den vollständigen Namen eingeben , anstatt die .exeErweiterung wegzulassen .


30
Nein, da grep den Inhalt seiner Eingabe untersucht, die Sie explizit angeben müssen. which and where.exe betrachtet nur die Namen der Dateien in einer Reihe von Verzeichnissen, die in den Umgebungsvariablen PATH festgelegt sind.
Michael Ratanapintha

12
@ Ajedi32 - Richtig, was nicht in XP ist. Wie gesagt "Windows Server 2003 und höher".
Michael Ratanapintha

24
Funktioniert in Windows 8
Rob

57
Achten Sie darauf, dass dies nicht in Powershell funktioniert, es sei denn, Sie geben where.exe
JonnyRaa

17
Denken where.exeSie daran, dass dies keine eingebaute Shell ist, die Sie %windir%\system32auf Ihrem Computer haben müssen %PATH%- was möglicherweise nicht der Fall ist, da die Verwendung wheredarauf hindeutet, dass Sie möglicherweise an Problemen mit Ihrem Pfad arbeiten!
Tomasz Gandor

288

Während spätere Windows-Versionen über einen whereBefehl verfügen , können Sie dies auch unter Windows XP mithilfe der folgenden Modifikatoren für Umgebungsvariablen 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 keine zusätzlichen Tools und sind nicht darauf beschränkt, PATHda Sie jede Umgebungsvariable (natürlich im Pfadformat) ersetzen können, die Sie verwenden möchten.


Und wenn Sie eine möchten, die alle Erweiterungen in PATHEXT verarbeiten kann (wie Windows selbst), dann macht diese 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 ganz einfach für bestimmte Suchregeln anpassen.


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

110
@ Michael, wenn Sie noch DOS oder Win95 verwenden, ist das Finden von ausführbaren Dateien auf dem Pfad das geringste Ihrer Probleme :-)
paxdiablo

Windows erkennt mehr als .exe als ausführbar. Das letzte Mal, als ich whichin W95 / DOS-Tagen ein Zurück codiert habe, war die Suchreihenfolge - aktuelles Verzeichnis, dann jedes Pfadverzeichnis für cmd.com, dann cmd.exe, dann cmd.bat. Also ist sogar cmd.bat im aktuellen Verzeichnis befroe befroe cmd.exe soemwhere in path
Mawg sagt, Monica am

3
@mawg, das Original war für den Ort, an dem Sie die Erweiterung kennen, da es die unter UNIX widerspiegelt (wo dieser Trick beim Hinzufügen von Erweiterungen nicht auftritt). Ich habe jetzt einen hinzugefügt, der tun kann, was Sie wollen, aber es ist nicht mehr ein einfacher Befehl, sondern ein Skript. Es versucht zuerst den schmucklosen Befehl, dann jeden der Erweiterungsbefehle. Ich hoffe, das hilft. Sie können es nach Ihren Wünschen anpassen (wenn Sie dieselbe Suchreihenfolge wie beispielsweise bei Windows wünschen - diese zeigt alle Möglichkeiten).
Paxdiablo

2
Um daraus ein Batch-Skript zu machen, erstellen Sie eine Datei mit dem Namen "which.bat": @echo off for %%i in (%1) do @echo. %%~$PATH:%i Um sie einem alias.bat-Skript hinzuzufügen, das Sie bei jeder Ausführung von cmd.exe laden (legen Sie das obige Skript in einem neuen Verzeichnis mit dem Namen C: \ usr ab \ aliases): DOSKEY which=C:\usr\aliases\which.bat $* Dann können Sie ein Skript erstellen, um cmd.exe mit der Datei alias.bat zu starten: cmd.exe /K E:\usr\aliases\alias.bat
Brad T.

152

Unter PowerShell Get-Commandfinden Sie 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 Bash type -a foo) - so dass es eine bessere gehen zu als andere Werkzeuge wie where.exe, which.exeusw , die von ihnen nicht bewusst sind , PowerShell-Befehle.

Suchen von ausführbaren Dateien, die nur einen Teil des Namens verwenden

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

Benutzerdefinierte ausführbare Dateien suchen

Um andere ausführbare Dateien zu finden, die nicht von Windows stammen (Python, Ruby, Perl usw.), müssen der PATHEXTUmgebungsvariablen (standardmäßig .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL) Dateierweiterungen für diese ausführbaren Dateien hinzugefügt werden , um Dateien mit diesen Erweiterungen in der PATHausführbaren Datei zu identifizieren . Da Get-Commanddiese Variable ebenfalls berücksichtigt wird, kann sie 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

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

Weitere Informationen und Beispiele finden Sie in der Online-Hilfe für Get-Command.


2
Es findet viel mehr als nur ausführbare Dateien. Es fängt auch Befehlsdateien
Maximilian Burszley

2
@ TheIncorrigible1 - wenn Sie mittlere Befehlsdateien wie Batch - Dateien ( .BAT, .CMDusw.), werden sie ausführbar angesehen , weil ihre Erweiterungen in der genannten sind PATHEXTvariabel (standardmäßig ist PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL). Andere ausführbare Typen (zB .py, .rbusw.) kann durch Hinzufügen der Dateierweiterung in und Erstellen eine ausführbare Assoziation mit hinzugefügt werden assoc/ ftypez - docs.python.org/3.3/using/...
shalomb


40

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

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

Mehr ist hier: Mein Manwich! PowerShell Welche


1
Ich suchte nach genau diesem markigen Powershell-Befehl. Ich hatte where.exe verwendet, aber mit dem Fehlercode herumspielen zu müssen, um seine Ausgabe zu analysieren, ist einer nativen Powershell-Lösung weit unterlegen. Vielen Dank!
Scobi

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

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

Ich kann which.exe nicht zum Laufen bringen, ich habe es versucht und es hat funktioniert.
Asfand Qazi


24

In Windows CMD- whichAufrufen where:

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

17

Cygwin ist eine Lösung. Wenn es Ihnen nichts ausmacht, eine Lösung von Drittanbietern zu verwenden, 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 oder in einer * 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 Ihr Verzeichnis aufnehmen PATH.


10
GnuWin32 erwähnt früher von Ferruccio ist viel besser in diesem Fall , wie Sie nativer haben können , wo ausführbare allein.
Piotr Dobrogost

GnuWin32 ist großartig, und ich benutze es, aber wenn Sie diese Funktionalität möchten, ohne die GnuWin32-Tools zu installieren, scheint where.exe der richtige Aufruf zu sein. Ich habe die GnuWin32-Tools jedoch in einer \ bin $ -Freigabe in unserem Netzwerk abgelegt, damit ich sie von Arbeitsstationen (und in Batchdateien) verwenden kann, auf denen sie nicht lokal installiert sind.
Craig

1
Wenn wir über die Verwendung von Cygwin in Windows sprechen, bevorzuge ich: cygpath -w "` which <appname> `"
mpasko256

12

In PowerShell gcmgibt es formatierte Informationen zu anderen Befehlen. Wenn Sie nur den Pfad zur ausführbaren Datei abrufen möchten, verwenden Sie.Source .

Zum Beispiel: gcm gitoder(gcm git).Source

Leckerbissen:

  • Verfügbar für Windows XP.
  • Verfügbar seit PowerShell 1.0.
  • gcmist ein Alias ​​von Get-CommandCmdlet .
  • Ohne Parameter werden alle verfügbaren Befehle aufgelistet, die von der Host-Shell angeboten werden.
  • Sie können einen benutzerdefinierten Alias ​​erstellen Set-Alias which gcmund wie folgt verwenden : (which git).Source.
  • Offizielle Dokumente: https://technet.microsoft.com/en-us/library/ee176842.aspx

11

Ich habe eine Funktion in meinem PowerShell-Profil mit dem Namen "welche".

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:

Keine der anderen Lösungen hat bei mir > get-command app.exe | format-listfunktioniert , aber perfekt!
Alexander McFarlane

10

Holen Sie sich Unxutils von hier: http://sourceforge.net/projects/unxutils/

Gold auf Windows-Plattformen, bringt alle netten Unix-Dienstprogramme auf ein Standard-Windows-DOS. Ich benutze es seit Jahren.

Es hat ein "was" enthalten. Beachten Sie jedoch, dass zwischen Groß- und Kleinschreibung unterschieden wird.

NB: Um es zu installieren, explodieren Sie die Zip-Datei und fügen Sie ... \ UnxUtils \ usr \ local \ wbin \ zu Ihrer Systempfad-Umgebungsvariablen hinzu.


2
Es ist nicht zwischen Groß- und Kleinschreibung zu unterscheiden, auch ich muss sagen, welche java.exe anstelle von welcher Java - Windows 7
Kalpesh Soni

Es hat ein paar Frustrationen, obwohl es mit Zeilenumbrüchen zu tun hat; grep zum Beispiel passt nicht zu EOL, ohne dass Sie ein .für das \ r eingeben. Es ist jedoch eine 99% ige Lösung!
Dash-Tom-Bang

Ja, es wird nicht zwischen Groß- und Kleinschreibung unterschieden, aber standardmäßig wird bei Dateinamen in Windows auch nicht zwischen Groß- und Kleinschreibung unterschieden.
Wernfried Domscheit

8

Nicht auf Lager von Windows , aber es wird bereitgestellt durch Service für Unix und es gibt einige einfache Batch - Skripten im Umlauf , die die gleiche Sache so dies zu erreichen dies ein .


1
Abgesehen davon, dass der von Ihnen verknüpfte Befehl nur die Variable PATH ausgibt und nicht einmal prüft, ob die Datei dort gefunden wurde.
Angel O'Sphere

8

Wenn Sie einen kostenlosen Pascal-Compiler finden, können Sie diesen kompilieren. Zumindest funktioniert es und zeigt den notwendigen Algorithmus.

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.

21
Wow, es gibt immer noch Leute, die Pascal benutzen? :-)
paxdiablo

6
Ich stelle mir das vor. Aber nicht ich. Haben Sie die Zeile program_date = '17 March 1994 'gesehen?
Mawg sagt, Monica am

1
Das Gerät my_funk;ist nicht erforderlich. Vielen Dank für die Veröffentlichung eines Pascal-Programms, erinnert mich an meine Jugend! Es ist so schade, dass sich Pascal nicht weiterentwickelt hat.
Yannis

2
Oh, aber es tat es. Es ist jetzt zum Beispiel objektorientiert. Auf lazarus-ide.org gibt es eine großartige kostenlose, plattformübergreifende Implementierung und IDE. Ein direkter Nachkomme von Borland lebt immer noch in Delphi unter embarcadero.com/products/delphi, was für die Starter-Edition mit 299 US-Dollar sehr teuer (imo) ist und $ 1k für die "verwendbare" Ausgabe. Es ist jedoch plattformübergreifend - Windows, iOS, Mac, Android. Holen Sie sich eine Testversion oder verwenden Sie Lazarus und fühlen Sie sich 20 Jahre jünger, -)
Mawg sagt, Monica

1
@yannis "so schade, dass Pascal sich nicht weiterentwickelt hat" ... abgesehen von 'Turbo Pascal' Anders, der C # entwirft, meinst du?
Piers7

7

Die beste Version davon, die ich unter Windows gefunden habe, ist Joseph Newcomers "whereis" -Dienstprogramm, das (mit Quelle) auf seiner Website verfügbar ist .

Der Artikel über die Entwicklung von "whereis" ist lesenswert.


1
Später Kommentar: whereis hat Probleme, ausführbare 64-Bit-Dateien unter Win 7 64-Bit zu finden.
Axel Kemper


6

Keiner der Win32-Ports von Unix, die ich im Internet finden konnte, ist zufriedenstellend, da alle einen oder mehrere dieser Mängel aufweisen:

  • Keine Unterstützung für Windows PATHEXT-Variable. (Dies definiert die Liste der Erweiterungen, die implizit zu jedem Befehl hinzugefügt werden, bevor der Pfad gescannt wird, und in welcher Reihenfolge.) (Ich verwende viele tcl-Skripte und bin nicht öffentlich verfügbar, welches Tool sie finden könnte.)
  • Keine Unterstützung für cmd.exe-Codepages, wodurch Pfade mit Nicht-ASCII-Zeichen falsch angezeigt werden. (Ich bin sehr empfindlich dafür, mit dem ç in meinem Vornamen :-))
  • Keine Unterstützung für die unterschiedlichen Suchregeln in cmd.exe und der PowerShell-Befehlszeile. (Kein öffentlich verfügbares Tool findet .ps1-Skripte in einem PowerShell-Fenster, jedoch nicht in einem cmd-Fenster!)

Also schrieb ich schließlich meine eigene, die alle oben genannten richtig unterstützt.

Dort verfügbar: http://jf.larvoire.free.fr/progs/which.exe


Zu Ihrer Information: Ich habe mein oben genanntes Tool which.exe und viele andere auf github.com/JFLarvoire/SysToolsLib als Open-Source-Version bereitgestellt . Möglicherweise erhalten Sie dort die neueste Version, melden Probleme usw.
Jean-François Larvoire

6

Diese Batchdatei verwendet die CMD-Variablenbehandlung, um den Befehl zu finden, der im Pfad ausgeführt werden würde. Hinweis: Das aktuelle Verzeichnis wird immer vor dem Pfad erstellt. Je nachdem, welcher API-Aufruf verwendet wird, werden andere Speicherorte vor / nach dem Pfad durchsucht.

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

Siehe set /?für Hilfe.


6

Ich verwende GOW (GNU unter Windows), eine leichte Version von Cygwin. Sie können es hier von GitHub herunterladen .

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

Ein Screenshot einer Liste der in GOW enthaltenen Befehle:

Geben Sie hier die Bildbeschreibung ein


5

Ich habe ein ähnliches Tool wie Ned Batchelder erstellt:

Durchsuchen von DLL- und EXE-Dateien in PATH

Während mein Tool hauptsächlich für die Suche nach verschiedenen DLL-Versionen vorgesehen ist, werden weitere Informationen (Datum, Größe, Version) angezeigt, es wird jedoch kein PATHEXT verwendet (ich hoffe, mein Tool bald zu aktualisieren).


5

Sie müssen nur die One-Liner-Batch-Datei von Windows veröffentlichen:

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

Ein Test:

C:>wh ssh
C:\cygwin64\bin\ssh.EXE
C:\Windows\System32\OpenSSH\\ssh.EXE

Kein Einzeiler, wenn Sie den Code in setlocal enableextensionsund einschließen endlocal.


2
Würde das in mehreren Zeilen vorziehen, damit ich es verstehen kann. ;-)
Gringo Suave

4

Für Sie Windows XP-Benutzer (die keinen whereBefehl eingebaut haben) habe ich einen "where like" -Befehl als Rubygem namens geschriebenwhichr .

Installieren Sie Ruby, um es zu installieren.

Dann

gem install whichr

Führen Sie es wie folgt aus:

C:> whichr cmd_here


3
Ich vermute, dass Sie herabgestuft werden, weil Sie vorschlagen, unter Windows XP etwas zu tun.
Sebastian-c

1
Ich habe nicht abgelehnt, aber die Installation von Ruby zur Implementierung eines trivialen Befehls ist ebenfalls schwer zu verkaufen. Oben befindet sich eine for-Schleife, die in ein Batch-Skript eingefügt werden kann.
Gringo Suave

2
Druckt es die Eröffnungszeilen des Titelsongs für The Witcher, wenn Sie es im ausführlichen Modus ausführen? ;)
Agi Hammerthief

3

TCC und TCC / LE von JPSoft sind CMD.EXE-Ersetzungen, die wichtige Funktionen hinzufügen. Relevant für die Frage des OP whichist ein eingebauter Befehl für Befehlsprozessoren der TCC-Familie.


2

Ich habe das whichModul von npm schon eine ganze Weile benutzt und es funktioniert sehr gut: https://www.npmjs.com/package/which Es ist eine großartige Alternative für mehrere Plattformen.

Jetzt bin ich zu dem gewechselt, der whichmit Git kommt. Fügen Sie Ihrem Pfad einfach den /usr/binPfad von Git hinzu, der sich normalerweise in befindet C:\Program Files\Git\usr\bin\which.exe. Die whichBinärdatei wird bei sein C:\Program Files\Git\usr\bin\which.exe. Es ist schneller und funktioniert auch wie erwartet.


1

Versuche dies

set a=%~$dir:1
If "%for%"=="" (Echo %1 not found) else (echo %1 found at %a%)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.