Wie finde ich den Speicherort einer ausführbaren Datei in Windows?

154

Ich erinnerte mich, dass ich ein Tool namens "as" verwendet habe where, um Speicherorte für ausführbare Programme wie dieses in einer Konsole zu finden:

 C:\Tmp\Where myTool.exe
 C:\Program Files\MyApp\myTools.exe
 ....

Jetzt kann ich dieses Tool nicht finden. Sind Sie sich nicht sicher, ob Windows ein integriertes Tool für diese Suche hat?

David.Chu.ca
quelle
1
Verschiedene Antworten über auf Gibt es ein Äquivalent von "welche" auf Windows? -
Stapelüberlauf
Wenn die Anwendung ausgeführt wird und Sie den Speicherort kennen müssen, verwenden Sie Process Explorer (von Sys Internals).
Ganesh R.
6
wherearbeitete für mich auf Windows 7 Enterprise
Bohemian
4
PAGING OP: Bitte aktualisiere die akzeptierte Antwort :)
Jake
1
@ David.Chu.ca bitte die akzeptierte Antwort aktualisieren
Matt Frear

Antworten:

351

Laut der StackOverflow-Antwort unter Gibt es unter Windows ein Äquivalent von "which"? , where.exefunktioniert dies unter Windows 7 und Windows Server 2003 und höher:

Beispiel

C:\> where ping

Ausgabe:

C:\Windows\System32\PING.EXE
Simon D
quelle
19
Dies sollte als die richtige Antwort angegeben werden, da dies ohne die Installation zusätzlicher Software funktioniert
Cookie
25
Ein wichtiger Teil dieser Antwort ist, dass in Powershell, whereein Standard-Alias ​​für die Where-Object, so dass Sie stattdessen verwenden müssen where.exe, oder gcm/Get-Command
Dave Andersen
2
Was ist mit Powershell? Wie kann ich dasselbe in Powershell erreichen?
krv
1
@krv Wie bei @DaveAndersen erwähnt, können Sie in Powershell Get-Command ping(oder nur gcm ping) eingeben , was Ihnen den vollständigen Pfad zusammen mit einigen anderen Informationen liefert .
Sam
22

BEARBEITEN: Ich hätte hinzufügen sollen, wenn Sie den WHERE-Befehl an der Eingabeaufforderung nicht verwenden können, überprüfen Sie Ihre PATH-Variable. (Verwenden Sie einfach den Befehl "path".) Stellen Sie sicher, dass sich C: \ Windows \ System32 in Ihrem Pfad befindet. Dort befindet sich "where.exe".

WO ist der gesuchte Befehl? WHERE ist wie eine Kreuzung zwischen der in der UNIX-Shell integrierten Funktion "which" und dem Befehl "locate", da es sowohl für ausführbare Befehlsdateien als auch für reguläre Dateien funktioniert.

Es ist auch etwas komplexer als eines dieser beiden, obwohl im Allgemeinen ein einfaches

WHERE <file>

wird funktionieren.

Es unterscheidet sich vom Befehl "locate" darin, dass nicht das gesamte Dateisystem durchsucht wird. Stattdessen wird standardmäßig an zwei Speicherorten nach Dateien gesucht:

  • Das aktuelle Verzeichnis.
  • Alle Verzeichnisse in der PATH-Variablen.

Jeder Befehl, den Sie direkt an einer Eingabeaufforderung ausführen können, ohne das Verzeichnis anzugeben, wird vom Befehl WHERE gefunden. (Da sich ein solcher Befehl bereits in der PATH-Variablenliste befindet.)

Wenn Sie nur in der Befehlspfadvariablen suchen möchten , können Sie Folgendes verwenden:

WHERE "$path:<search text>"

Wenn Sie dagegen alle Kopien einer Datei in einem Verzeichnisbaum suchen möchten, können Sie Folgendes verwenden:

WHERE /R <Top Level Directory> <search text>

Schließlich findet WHERE Befehle und alle Dateien mit einer Erweiterung aus der Variablen PATHEXT, ohne die Erweiterung einzuschließen. Alle anderen Dateien müssen entweder exakt oder mit Wildcards angegeben werden.

Nehmen Sie zum Beispiel die Dateien "dxdiag.exe" und "dxdiagn.dll". Beachten Sie den folgenden Befehl und seine Ausgabe:

WHERE /R C:\Windows dxdiag

C:\Windows\System32\dxdiag.exe
C:\Windows\SysWOW64\dxdiag.exe
C:\Windows\WinSxS\amd64_microsoft-windows-d..x-directxdiagnostic_31bf3856ad364e35_6.2.9200.16384_none_7c8d3f96e7882ec7\dxdiag.exe
C:\Windows\WinSxS\x86_microsoft-windows-d..x-directxdiagnostic_31bf3856ad364e35_6.2.9200.16384_none_206ea4132f2abd91\dxdiag.exe

Es ist erfolgreich, alle Versionen von "dxdiag.exe" zurückzugeben, da ".exe" eine der Erweiterungen in der PATHEXT-Variablen ist. (Hinweis: "WHERE dxdiag" hätte auch funktioniert, da sich C: \ Windows \ System32 in der PATH-Variablen befindet.)

WHERE /R C:\Windows dxdiagn

Andernfalls wird kein Ergebnis zurückgegeben, da ".dll" nicht in PATHEXT enthalten ist.

In diesem Fall sehen Sie sich das Ergebnis an, das durch das Hinzufügen eines Platzhalters erhalten wird:

WHERE /R C:\Windows dxdiagn*

C:\Windows\System32\dxdiagn.dll
C:\Windows\System32\en-US\dxdiagn.dll.mui
C:\Windows\SysWOW64\dxdiagn.dll
C:\Windows\SysWOW64\en-US\dxdiagn.dll.mui
C:\Windows\WinSxS\amd64_microsoft-windows-d..iagnostic.resources_31bf3856ad364e35_6.2.9200.16384_en-us_daccd04369b09c70\dxdiagn.dll.mui
C:\Windows\WinSxS\amd64_microsoft-windows-d..x-directxdiagnostic_31bf3856ad364e35_6.2.9200.16384_none_7c8d3f96e7882ec7\dxdiagn.dll
C:\Windows\WinSxS\x86_microsoft-windows-d..iagnostic.resources_31bf3856ad364e35_6.2.9200.16384_en-us_7eae34bfb1532b3a\dxdiagn.dll.mui
C:\Windows\WinSxS\x86_microsoft-windows-d..x-directxdiagnostic_31bf3856ad364e35_6.2.9200.16384_none_206ea4132f2abd91\dxdiagn.dll

Alle Versionen von dxdiagn.dll werden erfolgreich zurückgegeben.

Verwenden Sie für weitere Informationen "WHERE /?". Hoffe das hilft!

geo
quelle
2
where where C:\Windows\System32\where.exe:)
vp_arth
1
@vp_arth Dachte gerade genau das Gleiche :)
Reverse Engineer
10

benutze dir:

cd \
dir /s /b mytool.exe

Das cd \Teil wechselt in das Stammverzeichnis des Laufwerks, um sicherzustellen, dass die Suche oben in der Hierarchie beginnt.

John T
quelle
Es scheint, als würde man eine Windows-Suche über die Befehlszeile ausführen.
Ganesh R.
5
Das führt eine rekursive Suche des Laufwerks durch und würde ewig dauern.
Djhowell
6
Die einzige Möglichkeit, ausführbare Dateien zu finden, die NICHT in der Umgebungsvariablen PATH enthalten sind, besteht darin, dies zu tun. Er hat nie seinen Pfad angegeben, er hat eine ausführbare Datei gesagt .
John T
Es findet die ausführbare Datei, dauert aber eine Weile.
Michael Z
Dies funktioniert natürlich nur, wenn Sie den Namen der ausführbaren Datei oder zumindest einen Teil des Namens kennen
Oliver Williams
9

Beachten Sie, dass einige Dinge für PowerShell etwas anders sein können:

PS C:\Users\Rob.wb-devel> where ping

PS C:\Users\Rob.wb-devel> where git

PS C:\Users\Rob.wb-devel> whereis.bat git
C:\Program Files (x86)\Git\cmd\git.exe

PS C:\Users\Rob.wb-devel> where.exe git
C:\Program Files (x86)\Git\cmd\git.exe
Rob Jens
quelle
Danke, das funktioniert sowohl für cmd als auch für PowerShell
Ding-Yi Chen
3

Es ist frustrierend, dass es nicht als einfacher Befehl eingebaut ist.

Es gibt jedoch mehrere Lösungen, von denen eine eine Batchdatei ist .

Erstellen Sie eine Batch-Datei (which.bat) wie folgt:

@setlocal
@set P2=.;%PATH%
@for %%e in (%PATHEXT%) do @for %%i in (%~n1%%e) do @if NOT "%%~$P2:i"=="" echo %%~$P2:i 

Dieser sucht im lokalen Verzeichnis, nimmt einen Dateinamenparameter mit oder ohne Erweiterung und gibt die erste Übereinstimmung aus dem aktuellen Verzeichnis oder im PATH zurück.

Führen Sie es dann wie which cmd.exefolgt aus, um die cmd.exe zu finden, die ausgeführt wird, wenn Sie etwas eingeben cmd.

bw
quelle
3

Unter Windows können Sie die kostenlose Suchmaschine Everything verwenden , um sofort nach Dateien mit vollständigem oder teilweisem Namen zu suchen (wenn Ihre Festplatte in ntfs formatiert ist).

Harrymc
quelle
1
Nacht- und Tagesunterschied zwischen dieser und der Windows-Suche.
AnthonyVO
1

Wenn Sie wollen einfach nur die , die GnuWin32 hat Projekt eine Reihe von Unix - utils mit einzelnen Installateure.

Nur verliebt
quelle
1

In PowerShell

(@($env:path.split(";")) + (pwd).Path)  | where { dir $_ -ErrorAction SilentlyContinue |? Name -eq foo.exe }

Sie können dies problemlos in ein Cmdlet konvertieren.

Ein anderer Weg, dies zu erreichen, wie in einer Bearbeitung vorgeschlagen:

get-command notepad.exe | select Source
Anupam
quelle
0

Wenn Sie nur den Pfad zum Starten benötigen, ist es oft besser, den Befehl start zu verwenden. Sie können beispielsweise "start chrome.exe" verwenden, um Chrom {e | ium} zu starten, unabhängig davon, wo es installiert ist.

Anonymer Feigling
quelle
0

Heh, ich muss nur die One-Liner-Batch-Datei von Windows posten:

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

Nicht ganz einzeilig, wenn Sie den Code in setlocal enableextensionsund einschließen endlocal, was für Benutzer erforderlich ist, für die die Erweiterungen nicht standardmäßig aktiviert sind.

Bobbogo
quelle