% ProgramFiles% diferencias en Windows de 64 bits


8

Desde un símbolo del sistema, obtengo lo siguiente:

>echo %ProgramFiles%
C:\Program Files

Sin embargo, algunas aplicaciones (PHP en este caso, aunque he visto el mismo comportamiento desde dentro de httpd.conf de Apache), es:

>php -r "echo $_ENV['ProgramFiles'];"
C:\Program Files (x86)

¿Por qué es esto?

Antecedentes: estoy desarrollando scripts que son independientes de que el sistema operativo host sea de 32 bits o 64 bits, y para los archivos de configuración esto funciona muy bien. En un sistema de 32 bits, %ProgramFiles%es "C: \ Archivos de programa", y en un sistema de 64 bits que %ProgramFiles%aparentemente regresa C:\Program Files (x86). Tengo curiosidad por saber por qué no ocurre lo mismo cuando lo intento desde el símbolo del sistema de Windows (o en la barra del explorador, etc.). ¿Hay un símbolo del sistema de 64 bits o algo así?


En ambos entornos, %programfiles%retornos C:\Program Files(en una configuración predeterminada de Windows). En las versiones x64 de Windows, %programfiles(x86)regresa C:\Program Files (x86). No estoy seguro de por qué php está devolviendo algo contrario a eso, pero puede verificar fácilmente en qué están configuradas las variables ambientales para un sistema determinado al ejecutar setdesde un símbolo del sistema en x64 Windows y x86 Windows.
MDMarra

Respuestas:


12

Cuando una aplicación de 32 bits iniciada en un Windows de 64 bits aborda las variables de entorno del sistema% ProgramFiles% o% commonprogramfiles%, el subsistema WoW64 reemplaza los valores de estas variables con los valores de las variables% ProgramFiles (x86)% y "% commonprogramfiles (x86)%. Así, por ejemplo,% ProgramFiles% se abrirá como "C: \ Archivos de programa (x86)" cuando se direccione desde un programa de 32 bits.

Este comportamiento está determinado por el sistema de redirección de registros que proporciona compatibilidad con versiones anteriores de software de 32 bits con sistemas operativos de 64 bits. El entorno de 32 bits se emula para programas de 32 bits incluso a pesar de que los datos a los que se dirigen se encuentran en un lugar diferente.

Para evitar dicha redirección en un programa de 32 bits, debe usar las variables de entorno% programfiles% o% COMMONPROGRAMFILES% (es decir, con mayúsculas y minúsculas) o el indicador KEY_WOW64_64KEY al acceder a los nodos de registro correspondientes.


En realidad, en lugar de evitar la redirección, estoy tratando de promulgarla desde un indicador de Windows; Por ejemplo, me gustaría poder hacer un script %ProgramFiles%y usarlo C:\Program Filesen 32 bits y, sin embargo, usarlo C:\Program Files (x86)en 64 bits. Esta es la forma en que funcionan tanto Apache como PHP, y aunque no puedo comentar si esto es "correcto", es un comportamiento ingenioso. Por ejemplo, puedo configurarlo ServerRoot "${ProgramFiles}\Zend\Apache2"en httpd.conf, y encontrará correctamente la instalación de Zend / Apache (que se encuentra en la carpeta x86 en 64 bits) independientemente de la versión de Windows.
ken

3
En mi máquina, en un shell de comandos de 32 bits, echo %programfiles%aún devuelve la ruta de 32 bits. Sin embargo, hay una variable llamada ProgramW6432 que apunta a la ruta de 64 bits.
Harry Johnston

Esto no funciona para mi. Todas estas variables devuelven el mismo camino: var environmentVariables = new string[] { "%programfiles%", "%programfiles(x86)%", "%ProgramFiles%", "%commonprogramfiles%", "%COMMONPROGRAMFILES%" };
Saeed Neamati

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.