Windows 7-Cmd-Pfade sind unterschiedlich

Windows 7-Cmd-Pfade sind unterschiedlich

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 Rundie Methode verwenden, explorer.exewird die Instanz von der Instanz erstellt, die Ihren Desktop verwaltet cmd. Wenn Sie jedoch die ShiftMethode +Rechtsklick verwenden, wird die Instanz von einer anderen explorerInstanz 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, cmdhaben die Instanzen nicht dieselben Variablen.

Wenn die Konfiguration der Umgebungsvariablen in den Systemeigenschaften geändert wird, sendet das Betriebssystem eine WM_SETTINGCHANGENachricht an alle oberen Fenster. Die explorerInstanz, 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 ProcExpdie 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_BROADCASTNachricht WM_SETTINGCHANGEeine direkte Nachricht an den Dateibrowserprozess das Problem lösen (oder auch nicht).

Wie geht man damit um? Beenden Sie die explorerInstanz, 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 cmdInstanzen sehen die Änderungen.

Herausgegeben

Nach einigen Tests mit einem API-Monitor habe ich gesehen, dass der Prozess über einen API-Aufruf svchost.exeerstellt 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?explorerCreateProcessAsUserWlpEnvironmentsvchost.exe

Also ändere ich direkt die Variable in der Registry ( regedit), um sicherzustellen, dass keine WM_SETTINGSCHANGENachricht gesendet wird, beende die Dateibrowser- explorerInstanz und erstelle die beiden cmdInstanzen. Das Ergebnis ist

  • RunMethode: Die cmdInstanz 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.exeder den Desktop verwaltet.

  • Shift+Klick-Methode: Die Änderungen in der Registry sind verfügbar.

Daher svchost.exewerden 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.

verwandte Informationen