An einer Eingabeaufforderung erhalte ich Folgendes:
>echo %ProgramFiles%
C:\Program Files
Bei einigen Anwendungen (PHP in diesem Fall, obwohl ich das gleiche Verhalten in Apaches httpd.conf gesehen habe) ist es jedoch:
>php -r "echo $_ENV['ProgramFiles'];"
C:\Program Files (x86)
Warum ist das?
Hintergrund: Ich entwickle Skripte, die unabhängig davon sind, ob das Host-Betriebssystem 32-Bit oder 64-Bit ist, und für Konfigurationsdateien funktioniert dies hervorragend. Auf einem 32 - Bit - System, %ProgramFiles%
ist „C: \ Program Files“, und auf einem 64 - Bit - System , dass gleiche %ProgramFiles%
scheinbar zurückkehrt C:\Program Files (x86)
. Ich bin nur neugierig, warum das nicht gilt, wenn ich es an der Windows-Eingabeaufforderung (oder in der Explorer-Leiste usw.) versuche. Gibt es eine 64-Bit-Eingabeaufforderung oder so?
%programfiles%
zurückC:\Program Files
(in einer Standardkonfiguration von Windows). Gibt unter x64-Versionen von Windows%programfiles(x86)
zurückC:\Program Files (x86)
. Sie sind sich nicht sicher, warum PHP etwas Gegenteiliges zurückgibt, aber Sie können leicht überprüfen, auf welche Umgebungsvariablen für ein bestimmtes System eingestellt ist, indem Sieset
eine Eingabeaufforderung unter x64 Windows und x86 Windows ausführen.Antworten:
Wenn eine in einem 64-Bit-Windows gestartete 32-Bit-Anwendung die Systemumgebungsvariablen% ProgramFiles% oder% commonprogramfiles% adressiert, ersetzt das WoW64-Subsystem die Werte dieser Variablen durch die Werte der Variablen% ProgramFiles (x86)% und "%" commonprogramfiles (x86)%. So wird beispielsweise% ProgramFiles% bei der Adressierung aus einem 32-Bit-Programm als "C: \ Programme (x86)" geöffnet.
Dieses Verhalten wird vom Registerumleitungssystem bestimmt, das die Abwärtskompatibilität von 32-Bit-Software mit 64-Bit-Betriebssystemen bietet. Die 32-Bit-Umgebung wird für 32-Bit-Programme emuliert, obwohl sich die von ihnen adressierten Daten an einem anderen Ort befinden.
Um eine solche Umleitung in einem 32-Bit-Programm zu vermeiden, sollten Sie beim Zugriff auf die entsprechenden Registerknoten die Umgebungsvariablen% programfiles% oder% COMMONPROGRAMFILES% (dh mit umgekehrter Schreibweise) oder das Flag KEY_WOW64_64KEY verwenden.
quelle
%ProgramFiles%
und sieC:\Program Files
auf 32 Bit und dennochC:\Program Files (x86)
auf 64 Bit verwenden zu lassen. Dies ist die Art und Weise, wie sowohl Apache als auch PHP funktionieren, und obwohl ich nicht kommentieren kann, ob dies "richtig" ist, ist es ein raffiniertes Verhalten. Zum Beispiel kann ichServerRoot "${ProgramFiles}\Zend\Apache2"
in httpd.conf festlegen, dass die Zend / Apache-Installation (die sich auf 64-Bit im x86-Ordner befindet) unabhängig von der Windows-Version korrekt gefunden wird.echo %programfiles%
immer noch der 32-Bit-Pfad zurückgegeben. Es gibt jedoch eine Variable namens ProgramW6432, die auf den 64-Bit-Pfad verweist.var environmentVariables = new string[] { "%programfiles%", "%programfiles(x86)%", "%ProgramFiles%", "%commonprogramfiles%", "%COMMONPROGRAMFILES%" };