Suchen des Pfads des Programms, das über die Befehlszeile in Windows ausgeführt wird

128

Angenommen, ich habe ein Programm X.EXEim Ordner c:\abcd\happy\auf dem System installiert . Der Ordner befindet sich im Systempfad. Angenommen, es gibt ein anderes Programm auf dem System, das ebenfalls X.EXE heißt, aber im Ordner installiert ist c:\windows\.

Ist es möglich, schnell über die Befehlszeile herauszufinden, X.EXEwelche der beiden X.EXEgestartet wird , wenn ich tippe? (aber ohne direkt suchen oder die Prozessdetails im Task-Manager anzeigen zu müssen).

Vielleicht eine Art eingebauter Befehl oder ein Programm da draußen, das so etwas kann? ::

detect_program_path X.EXE
Zabba
quelle
2
Mögliches Duplikat von Gibt es in der Windows-Befehlszeile ein Äquivalent zu 'which'?
Michael Freidgeim

Antworten:

238

Verwenden Sie den whereBefehl. Das erste Ergebnis in der Liste wird ausgeführt.

C: \> wo Notizblock
C: \ Windows \ System32 \ notepad.exe
C: \ Windows \ notepad.exe

Nach dieser Blog - Post , where.exewird mit Windows Server 2003 und höher enthält, so dass diese nur mit Vista, Win 7, et al funktionieren sollen.

Unter Linux ist das Äquivalent der whichBefehl, z which ssh.

Chris Schmich
quelle
2
+1! Ich wusste nie, dass dies ein Teil von Windows sein könnte und schaute daher nicht in diese Richtung! :)
Zabba
1
Gibt es ein Äquivalent für die armen XP-Benutzer?
shahar_m
@shahar_m: Hast du das folgende Skript von Michael Burr ausprobiert? Es ist nicht eingebaut, aber es könnte das tun, was Sie brauchen.
Chris Schmich
1
@Kenny: Angenommen, Sie kennen den Namen der DLL, können Sie das Dienstprogramm ListDLLs ( technet.microsoft.com/en-us/sysinternals/bb896656 ) verwenden. Führen Sie listdlls -d foo.dllin der Befehlszeile einfach alle Prozesse aus, in denen das Modul geladen ist, und den vollständigen Pfad zum geladenen Modul. Alternativ können Sie einfach eine Windows-Dateisuche nach dem Dateinamen durchführen.
Chris Schmich
2
@Kenny: Was du fragst, unterscheidet sich sehr von der hier veröffentlichten Antwort. Sie sollten eine neue Stapelüberlauffrage mit den von Ihnen durchgeführten Recherchen erstellen und in diesen Kommentaren einen Link dazu veröffentlichen.
Chris Schmich
10

Hier ist ein kleines Cmd-Skript, das Sie kopieren und in eine Datei mit dem Namen einfügen können where.cmd:

@echo off
rem - search for the given file in the directories specified by the path, and display the first match
rem
rem    The main ideas for this script were taken from Raymond Chen's blog:
rem
rem         http://blogs.msdn.com/b/oldnewthing/archive/2005/01/20/357225.asp
rem
rem
rem - it'll be nice to at some point extend this so it won't stop on the first match. That'll
rem     help diagnose situations with a conflict of some sort.
rem

setlocal

rem - search the current directory as well as those in the path
set PATHLIST=.;%PATH%
set EXTLIST=%PATHEXT%

if not "%EXTLIST%" == "" goto :extlist_ok
set EXTLIST=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
:extlist_ok

rem - first look for the file as given (not adding extensions)
for %%i in (%1) do if NOT "%%~$PATHLIST:i"=="" echo %%~$PATHLIST:i

rem - now look for the file adding extensions from the EXTLIST
for %%e in (%EXTLIST%) do @for %%i in (%1%%e) do if NOT "%%~$PATHLIST:i"=="" echo %%~$PATHLIST:i
Michael Burr
quelle
8

Wie der im Kommentar erwähnte Thread , get-commandkann es auch in Powershell funktionieren. Sie können get-command npmbeispielsweise Folgendes eingeben und die Ausgabe lautet wie folgt:

Geben Sie hier die Bildbeschreibung ein

Eugene
quelle
(get-command npm).Sourceantwortet nur mit dem Pfad zu npm (für das Beispiel) anstelle der gesamten Tabelle aller Eigenschaften.
David Brown