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í?
fuente
%programfiles%
retornosC:\Program Files
(en una configuración predeterminada de Windows). En las versiones x64 de Windows,%programfiles(x86)
regresaC:\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 ejecutarset
desde un símbolo del sistema en x64 Windows y x86 Windows.Respuestas:
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.
fuente
%ProgramFiles%
y usarloC:\Program Files
en 32 bits y, sin embargo, usarloC:\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 configurarloServerRoot "${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.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.var environmentVariables = new string[] { "%programfiles%", "%programfiles(x86)%", "%ProgramFiles%", "%commonprogramfiles%", "%COMMONPROGRAMFILES%" };