% ProgramFiles% Unterschiede unter 64-Bit-Windows

8

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?

Ken
quelle
Gibt in beiden Umgebungen %programfiles%zurück C:\Program Files(in einer Standardkonfiguration von Windows). Gibt unter x64-Versionen von Windows %programfiles(x86)zurück C:\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 Sie seteine Eingabeaufforderung unter x64 Windows und x86 Windows ausführen.
MDMarra

Antworten:

12

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.

justin0
quelle
Anstatt die Umleitung zu vermeiden, versuche ich, sie über eine Windows-Eingabeaufforderung zu aktivieren. Zum Beispiel möchte ich in der Lage sein, Skripte zu erstellen %ProgramFiles%und sie C:\Program Filesauf 32 Bit und dennoch C:\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 ich ServerRoot "${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.
Ken
3
Auf meinem Computer wird in einer 32-Bit-Befehlsshell echo %programfiles%immer noch der 32-Bit-Pfad zurückgegeben. Es gibt jedoch eine Variable namens ProgramW6432, die auf den 64-Bit-Pfad verweist.
Harry Johnston
Das funktioniert bei mir nicht. Alle diese Variablen geben den gleichen Pfad zurück: var environmentVariables = new string[] { "%programfiles%", "%programfiles(x86)%", "%ProgramFiles%", "%commonprogramfiles%", "%COMMONPROGRAMFILES%" };
Saeed Neamati