
Ich versuche, die Systempfade auf meinem Computer zu ändern.
Aus irgendeinem Grund sind meine Pfade wie erwartet korrekt, wenn ich cmd über „Ausführen“ öffne.
Wenn ich jedoch die Umschalttaste drücke und mit der rechten Maustaste in ein Verzeichnis klicke und hier das Befehlsfenster öffne, erhalte ich einen alten/anderen Pfad, der weder unter USER noch unter SYSTEM in der Pfadvariable angezeigt wird.
Beispiel:
CMD von RUN:
C:\Users\PERSON>python
Python 2.7.7 (default, Jun 1 2014, 14:17:13) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
C:\Users\PERSON>pip
Usage:
pip <command> [options]
CMD von Umschalt+Rechtsklick:
C:\Users\PERSON>python
'python' is not recognized as an internal or external command,
operable program or batch file.
C:\Users\PERSON>pip
'pip' is not recognized as an internal or external command,
operable program or batch file.
Ich habe die Pfade sowohl im System als auch im Benutzer geändert, um zu sehen, ob es dort ein seltsames Problem gab, aber das Problem besteht weiterhin.
Wenn Sie weitere Informationen benötigen, lassen Sie es mich wissen.
Bearbeiten: Ich habe alle Eingabeaufforderungen zwischen den Pfadänderungen neu gestartet.
Edit 2: Hier sind die Pfade
CMD von RUN:
C:\Users\PERSON>echo %path%
C:\ProgramData\Oracle\Java\javapath;
C:\Windows\system32;
C:\Windows;
C:\Windows\System32\Wbem;
C:\Windows\System32\WindowsPowerShell\v1.0\;
C:\EASE\Cygwin\Bin;
C:\bin;
C:\bin\Hardware;
C:\bin\OpenCV;
C:\bin\Qt;
C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;
C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin;
C:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev98\Bin;
C:\Python27\;
C:\Python27\Scripts;
C:\Program Files (x86)\Skype\Phone\;
C:\Program Files\SlikSvn\bin;
C:\Program Files (x86)\GNU Tools ARM Embedded\4.7 2012q4\bin;
CMD von Umschalt+Rechtsklick:
C:\Users\PERSON\Desktop>echo %path%
C:\ProgramData\Oracle\Java\javapath;
C:\Windows\system32;
C:\Windows;
C:\Windows\System32\Wbem;
C:\Windows\System32\WindowsPowerShell\v1.0\;
C:\bin;
C:\bin\Hardware;
C:\bin\OpenCV;
C:\bin\Qt;
C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;
C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin;
C:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev98\Bin;
C:\Program Files (x86)\Skype\Phone\;
C:\Program Files (x86)\GNU ToolsARM Embedded\4.7 2012q4\bin;
Antwort1
Wenn ein Prozess gestartet wird,standardmäßigdie Umgebungsvariablen sindkopiertvom übergeordneten Prozess (der die Anforderung zur Erstellung des neuen Prozesses stellt) zum neu erstellten Prozess.
Wenn Sie Run
die Methode verwenden, explorer.exe
wird die Instanz von der Instanz erstellt, die Ihren Desktop verwaltet cmd
. Wenn Sie jedoch die ShiftMethode +Rechtsklick verwenden, wird die Instanz von einer anderen explorer
Instanz erstellt, Kind von svchost.exe
(Kind von services.exe
, Kind von wininit.exe
) cmd
.
Wenn beide Explorer-Versionen nicht über dieselben Umgebungsblöcke verfügen, cmd
haben die Instanzen nicht dieselben Variablen.
Wenn die Konfiguration der Umgebungsvariablen in den Systemeigenschaften geändert wird, sendet das Betriebssystem eine WM_SETTINGCHANGE
Nachricht an alle oberen Fenster. Die explorer
Instanz, die den Desktop verwaltet, empfängt diese Nachricht und aktualisiert ihren Umgebungsblock, aber die Instanz, die das Durchsuchen von Dateien verwaltet (die unter svchost.exe
), verarbeitet die Nachricht nicht (nein, im Moment weiß ich nicht, warum) und ihr Umgebungsblock wird nicht aktualisiert (all dies wurde mit sysinternal getestet, das ProcExp
die Prozessumgebungen überprüft).
Wie kann ich das Problem lösen? Ich weiß es nicht. Vielleicht (nein, nicht getestet, ich habe gerade keinen Compiler zur Hand, nur eine Idee) könnte statt einer HWND_BROADCAST
Nachricht WM_SETTINGCHANGE
eine direkte Nachricht an den Dateibrowserprozess das Problem lösen (oder auch nicht).
Wie geht man damit um? Beenden Sie die explorer
Instanz, deren übergeordneter Prozess ist svchost.exe
. Wenn ein neuer Dateibrowser angefordert wird, wird eine neue Instanz mit dem richtigen Umgebungsblock gestartet.
Für einen groben Ansatz, nur zum Ausprobieren, führen Sie es von der Befehlszeile aus aus
wmic process where "name='explorer.exe' and CommandLine like '%/factory%'" call Terminate
um den Dateibrowser zu beenden. Wenn ein neuer Dateibrowser angefordert wird, wird ein neuer Prozess erstellt (jetzt mit aktualisierter Umgebung) und neue cmd
Instanzen sehen die Änderungen.
Herausgegeben
Nach einigen Tests mit einem API-Monitor habe ich gesehen, dass der Prozess über einen API-Aufruf svchost.exe
erstellt wird . In diesem Aufruf ist das Argument nicht null (wenn es null ist, wird die Umgebung vom übergeordneten zum untergeordneten Prozess kopiert), daher wird die Umgebung für den neuen Prozess erstellt. Aber welche Quelle wird zum Erstellen der neuen Umgebung verwendet?explorer
CreateProcessAsUserW
lpEnvironment
svchost.exe
Also ändere ich direkt die Variable in der Registry ( regedit
), um sicherzustellen, dass keine WM_SETTINGSCHANGE
Nachricht gesendet wird, beende die Dateibrowser- explorer
Instanz und erstelle die beiden cmd
Instanzen. Das Ergebnis ist
Run
Methode: Diecmd
Instanz sieht die Änderungen nicht. Da es keine Nachricht an den übergeordneten Prozess gab, wurde dessen Umgebung nicht geändert und der neu gestartete Prozess erbt die unveränderte Version von dem,explorer.exe
der den Desktop verwaltet.Shift+Klick-Methode: Die Änderungen in der Registry sind verfügbar.
Daher svchost.exe
werden die Informationen aus der Registrierung abgerufen, um einen Umgebungsblock zu erstellen, der an den neu erstellten Prozess übergeben wird.
Antwort2
Nachdem Sie den Pfad geändert haben, müssen Sie sicherstellen, dassExplorer neu startenbevor Sie versuchen, alle Ihre Terminals erneut zu öffnen. Auf diese Weise nimmt der Explorer-Prozess den neuen Pfad auf und kann diesen neuen Pfad an neue Programme übertragen, die er ausführt.