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?
%programfiles%
retornaC:\Program Files
(em uma configuração padrão do Windows). Nas versões x64 do Windows,%programfiles(x86)
retornaC:\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 executandoset
em um prompt de comando no Windows x64 e no Windows x86.Respostas:
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.
fonte
%ProgramFiles%
e usá-loC:\Program Files
em 32 bits e aindaC:\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 definirServerRoot "${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.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.var environmentVariables = new string[] { "%programfiles%", "%programfiles(x86)%", "%ProgramFiles%", "%commonprogramfiles%", "%COMMONPROGRAMFILES%" };