Diferenças de% ProgramFiles% no Windows de 64 bits


8

Em um prompt de comando, obtenho o seguinte:

>echo %ProgramFiles%
C:\Program Files

No entanto, algumas aplicações (PHP, neste caso, embora eu tenha visto o mesmo comportamento no httpd.conf do Apache), são:

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

Por que é isso?

Antecedentes: estou desenvolvendo scripts que são independentes do SO host de 32 bits ou 64 bits e, para arquivos de configuração, isso funciona muito bem. Em um sistema de 32 bits, %ProgramFiles%é "C: \ Arquivos de Programas" e em um sistema de 64 bits, o mesmo %ProgramFiles%aparentemente retorna C:\Program Files (x86). Só estou curioso para saber por que o mesmo não se aplica quando tento no prompt de comando do Windows (ou na barra do explorador, etc.). Existe um prompt de comando de 64 bits ou algo assim?


Nos dois ambientes, %programfiles%retorna C:\Program Files(em uma configuração padrão do Windows). Nas versões x64 do Windows, %programfiles(x86)retorna C:\Program Files (x86). Não sei por que o php está retornando algo contrário a isso, mas você pode facilmente verificar como as variáveis ​​ambientais de um determinado sistema estão definidas executando setem um prompt de comando no Windows x64 e no Windows x86.
MDMarra

Respostas:


12

Quando um aplicativo de 32 bits iniciado no Windows de 64 bits aborda as variáveis ​​de ambiente do sistema% ProgramFiles% ou% commonprogramfiles%, o subsistema WoW64 substitui os valores dessas variáveis ​​pelos valores das variáveis% ProgramFiles (x86)% e "% commonprogramfiles (x86)%. Assim, por exemplo,% ProgramFiles% será aberto como "C: \ Arquivos de Programas (x86)" ao endereçar a partir de um programa de 32 bits.

Esse comportamento é determinado pelo sistema de redirecionamento de registro que fornece compatibilidade com versões anteriores do software de 32 bits com os sistemas operacionais de 64 bits. O ambiente de 32 bits é emulado para programas de 32 bits, apesar do fato de os dados que eles estão endereçando estarem localizados em um local diferente.

Para evitar esse redirecionamento em um programa de 32 bits, você deve usar as variáveis ​​de ambiente% programfiles% ou% COMMONPROGRAMFILES% (ou seja, com maiúsculas e minúsculas) ou o sinalizador KEY_WOW64_64KEY ao acessar os nós de registro correspondentes.


Na verdade, em vez de evitar o redirecionamento, estou tentando decifrá-lo em um prompt do Windows; por exemplo, eu gostaria de poder fazer scripts %ProgramFiles%e usá-lo C:\Program Filesem 32 bits e ainda C:\Program Files (x86)em 64 bits. Essa é a maneira pela qual o Apache e o PHP funcionam e, embora eu não possa comentar se isso é "correto", é um comportamento bacana. Por exemplo, eu posso definir ServerRoot "${ProgramFiles}\Zend\Apache2"no httpd.conf e ele encontrará corretamente a instalação do Zend / Apache (que está na pasta x86 em 64 bits), independentemente da versão do Windows.
ken

3
Na minha máquina, em um shell de comando de 32 bits, echo %programfiles%ainda retorna o caminho de 32 bits. Há, no entanto, uma variável chamada ProgramW6432 que aponta para o caminho de 64 bits.
Harry Johnston

Isso não funciona para mim. Todas essas variáveis ​​retornam o mesmo caminho: var environmentVariables = new string[] { "%programfiles%", "%programfiles(x86)%", "%ProgramFiles%", "%commonprogramfiles%", "%COMMONPROGRAMFILES%" };
Saeed Neamati

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.