Sucht die Windows-Eingabeaufforderung an einer anderen Stelle als der in der Variablen PATH angegebenen, wenn Anwendungsprogramme gestartet werden?

35

Ich habe das folgende Experiment versucht.

Bevor ich anfange, habe ich die PATH-Variable von cmd überprüft, die den folgenden Wert hat:

Path=C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\ProgramData\Lenovo\ReadyApps;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files (x86)\Windows Live\Shared;C:\Program Files (x86)\Skype\Phone\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Calibre2\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;

Zuerst dachte ich, dass cmd nur nach ausführbaren Dateien in den Verzeichnissen sucht, die in der PATH-Variablen enthalten sind, also habe ich zufällig eine Anwendung ausgewählt - winword.exe (Microsoft Word) und versucht, sie über die Befehlszeile zu starten:

start winword

Aber zu meiner Überraschung startet das Programm! Der Grund, warum ich überrascht bin, ist, dass ich alle Verzeichnisse in der PATH-Variablen nach der Exe-Datei namens 'winword' durchsucht habe, aber alle meine Suchanfragen waren leer!

Ich bin daher zu dem Schluss gekommen, dass die Eingabeaufforderung andere Stellen als die in der PATH-Variablen angegebenen durchsucht haben muss, um nach ausführbaren Dateien zu suchen.

Das nächste, was ich tat, war natürlich, nach dem genauen Speicherort zu suchen, an dem sich die ausführbare Datei "winword" befindet. Es stellt sich heraus, dass sich winword.exe hier befindet:

C:\Program Files\Microsoft Office 15\root\office15

Daraus ergibt sich die Idee, dass CMD beim Ausführen des Befehls 'start' möglicherweise automatisch ProgramFiles und ProgramFiles (x86) (und alle ihre Unterverzeichnisse) durchsucht? Aus diesem Grund habe ich versucht, eine andere auf meinem Computer installierte Anwendung, Audacity, mit der exe-Datei zu starten, die sich unter folgender Adresse befindet:

C:\Program Files (x86)\Audacity

Zu meiner Überraschung konnte Audacity erneut nicht gestartet werden, als ich Folgendes eingab:

start audacity

an der Befehlszeile.

Bildbeschreibung hier eingeben

Ich habe dann das Verzeichnis mit audacity.exe zu PATH hinzugefügt:

set path=%path%;C:\Program Files (x86)\Audacity

Danach habe ich versucht, Audacity erneut zu starten:

start audacity

Nun, nicht überraschend, startete Audacity.

Ich möchte wissen, wo genau die Eingabeaufforderung nach ausführbaren Dateien sucht. Warum wird winword.exe auch dann gestartet, wenn das Verzeichnis, in dem es sich befindet, nicht Teil von PATH ist, aber das Gleiche gilt nicht für audacity.exe?

Ich habe auch andere Anwendungen ausprobiert. Chrome und Firefox funktionieren, wenn ich den Startbefehl verwende.

UPDATE: Ich verwende Windows Version 6.3.9600 (Windows 8.1)

Anthony
quelle
1
Der Kern meiner Antwort auf Kyle Delaneys Frage vor ungefähr anderthalb Jahren befasst sich auch mit dieser Frage.
TOOGAM

Antworten:

44

Zuerst dachte ich, dass cmd nur nach ausführbaren Dateien in den Verzeichnissen sucht, die in der PATH-Variablen enthalten sind, also habe ich zufällig eine Anwendung ausgewählt - winword.exe (Microsoft Word) und versucht, sie über die Befehlszeile zu starten:

Der Grund dafür winword.exeist, dass ein Registrierungsschlüssel vorhanden ist, der den Pfad zu Microsoft Word (Winword.exe) definiert. Ein ähnlicher Schlüssel ist für Firefox.exe und Chrome.exe vorhanden, wenn diese Anwendungen installiert sind.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

Ich möchte wissen, wo genau die Eingabeaufforderung nach ausführbaren Dateien sucht.

System-PATH-Variable, Benutzer-PATH-Variable und die verschiedenen Schlüssel darin ..\App Paths. Ich konnte bestätigen, dass Audacity bei der Installation keinen Schlüssel für sich selbst erstellt.

Wenn die ShellExecuteEx-Funktion mit dem Namen einer ausführbaren Datei im Parameter lpFile aufgerufen wird, sucht die Funktion an mehreren Stellen nach der Datei. Es wird empfohlen, Ihre Anwendung im Registrierungsunterschlüssel App Paths zu registrieren. Auf diese Weise müssen Anwendungen die Umgebungsvariable PATH des Systems nicht ändern.

  • Das aktuelle Arbeitsverzeichnis.
  • Nur das Windows-Verzeichnis (es werden keine Unterverzeichnisse durchsucht).
  • Das Windows \ System32-Verzeichnis.
  • Verzeichnisse, die in der Umgebungsvariablen PATH aufgeführt sind.
  • Empfohlen: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ App-Pfade

Quelle: Anwendungsregistrierung

Ramhound
quelle
15

Wenn Sie an der Eingabeaufforderung nur eingeben WinWord, schlägt die Ausführung fehl.

Wenn Sie eingeben, wird START WinWordes ausgeführt.

Der StartBefehl ist hier der Schlüssel.

Wenn Sie versuchen, eine Datei über den Befehl start auszuführen, führt die Eingabeaufforderung keine Suche durch. Stattdessen übergibt es den Dateinamen (und die Argumente) an Windows selbst (über den ShellExecuteEx-API-Aufruf), das dann nach dem Speicherort der Datei suchen muss. Es gibt mehrere Orte, die in der folgenden Reihenfolge durchsucht werden:

  • Das aktuelle Arbeitsverzeichnis.

  • WindowsNur das Verzeichnis (es werden keine Unterverzeichnisse durchsucht).

  • Das Windows\System32Verzeichnis.

  • In der PATHUmgebungsvariablen aufgelistete Verzeichnisse .

  • Empfohlen:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

WinWordist in diesem Registrierungsschlüssel. Der Schlüssel ist da, um PATHnicht zu lang zu werden.

Larryc
quelle
7
Bitte zitieren und zitieren Sie alle Quellen. Sofern Sie die Suchreihenfolge nicht aus dem Speicher geschrieben haben, sollten Sie Ihre Quelle angeben, die die Liste und die Reihenfolge angibt, in der gesucht wird.
Ramhound
Die Quelle wären meine Notizen von etwas, an dem ich vor ein paar Jahren gearbeitet habe. Ich weiß nicht, wo ich es damals aufgenommen habe, Webseiten kommen und gehen.
Larryc
5
Sie haben sie aus derselben Dokumentation erhalten, aus der alle anderen sie erhalten haben.
Ramhound
7

Das Programm (wenn Sie seinen Modulnamen ohne Laufwerk / Pfad in der Eingabeaufforderung angeben) im Windows-Befehlsprozessor (CMD.EXE) kann beim Auffinden gestartet werden:

  • nach PATH-Umgebungsvariable (sowohl die ausführbare Datei als auch der gleichnamige Hardlink / Softlink / Shortcut)

  • von DOSKEY alias

  • nach Anwendungspfad von HKLM\Software\Microsoft\Windows\CurrentVersion\App Pathsoder HKCU\Software\Microsoft\Windows\CurrentVersion\App Paths(bei Verwendung des startBefehls)

Mit diesem Wissen (insbesondere dem letzten) können Sie Ihre eigenen, für Sie passenden Aliase erstellen. Zum Beispiel können Sie HKCU\Software\Microsoft\Windows\CurrentVersion\App Paths\au.exemit dem Standardwert von erstellenC:\Program Files (x86)\Audacity\Audacity.exe und diese Anwendung starten, indem Sie einfach die start auEingabeaufforderung eingeben .

Akina
quelle
0

Während die anderen Antworten wahrscheinlich der spezifische Grund für Ihren Fall sind, gibt es auch eine andere Antwort auf Ihre Frage, die für einige andere Anwendungen der Fall sein könnte: an derselben Stelle, an der Sie gesucht haben, aber mit unterschiedlichen Dateierweiterungen.

Sie haben ausdrücklich gesagt, dass Sie nach Dateien mit der Erweiterung suchen exe. Windows versucht auch, Dateien mit anderen Erweiterungen auszuführen.

Eine weitere Umgebungsvariable, die beim Ausführen eines Befehls ins Spiel kommt, ist die Variable PATHEXT. Dies ist eine ;begrenzte Liste von Dateierweiterungen, die ausgeführt werden sollen. Wenn Sie Echo sehen PATHEXTSie möglicherweise etwas wie .COM;.EXE;.BAT;.CMD;.VBS;... (etc.). Einige Anwendungen verwenden diese anderen Dateitypen als Endbenutzer-Einstiegspunkt. Es ist viel seltener, aber es passiert. Ich habe mehrere kommerzielle Hauptprodukte verwendet, die von .BATSkripten ausgehen. Um eines davon als Beispiel zu verwenden, kann ich es mit dem Befehl starten standalone, obwohl es keinen gibt standalone.exe... stattdessen hat es einen standalone.bat.

Einige der Erweiterungen, die PATHEXTich im Moment ansehe, habe ich noch nie in einer Anwendung verwendet. Ones , dass ich habe mehr in viel häufig laufen (aber offensichtlich nicht so viel wie exe) ist: .com, .bat, .vbs, .js, .jar. Die ersten beiden sind Windows-Batch-Skriptdateien, und die anderen drei sind Dateitypen für bestimmte Programmiersprachen, die von Skripten oder virtuellen Maschinen anstelle von exes (Visual Basic, Javascript und Java) ausgeführt werden.

Loduwijk
quelle
Möchte der Downwähler einen Kommentar abgeben (ich weiß, dass es normalerweise sinnlos ist zu fragen, aber manchmal bekomme ich eine Antwort)? Habe ich irgendwo einen Fehler gemacht?
Loduwijk
Nicht ich, aber es ist eine wilde Vermutung, denn während PATHEXTund PATH, beide im Zusammenhang damit stehen, Dinge zum Laufen zu bringen, sind sie in ihren jeweiligen Aufgaben etwas orthogonal. PATHGibt an, wo nach auszuführenden Dingen gesucht werden soll, und fordert das OP an, während PATHEXTangegeben wird, was ausgeführt werden kann.
Dgnuff
@dgnuff Interessant, da dies mein Punkt war: OP formulierte die Frage spezifisch in einer Weise, die nach einer Rahmenherausforderung verlangte. In SE-Begriffen stellten sie eine "XY-Frage", indem sie davon ausgingen, dass die Datei, die ausgeführt wurde, nicht lief an den Orten, die bereits auf dem Weg durchsucht wurden. Trotzdem danke.
Loduwijk
0

start winwordweist die Eingabeaufforderung nicht an, zu starten winword. Es weist die Eingabeaufforderung an, startmit Argument zu starten winword. Startverwendet seine eigenen Methoden, um zu finden winword.

winwordFordert die Eingabeaufforderung einfach zum Starten auf winword. Und wenn Sie das versuchen, winwordwird PATHes nicht gestartet , da es nicht auf dem ist.

Eric Towers
quelle