64ビットWindowsでの%ProgramFiles%の違い


8

コマンドプロンプトから、以下を取得します。

>echo %ProgramFiles%
C:\Program Files

ただし、一部のアプリケーション(この例ではPHPですが、Apacheのhttpd.conf内から同じ動作が見られます)は次のとおりです。

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

どうしてこれなの?

背景:私は、ホストOSが32ビットまたは64ビットであることを認識しないスクリプトを開発しています。構成ファイルの場合、これはうまく機能します。32ビットシステムで%ProgramFiles%は "C:\ Program Files"であり、64ビットシステムでは同じ%ProgramFiles%ように見えますC:\Program Files (x86)。Windowsのコマンドプロンプト(またはエクスプローラーバーなど)から試しても同じことが当てはまらないのはなぜですか。64ビットのコマンドプロンプトなどはありますか?


どちらの環境でも(Windowsのデフォルト構成で)%programfiles%戻りますC:\Program Files。x64バージョンのWindowsでは、を%programfiles(x86)返しますC:\Program Files (x86)。phpがなぜそれとは逆の結果を返すのかはわかりませんがset、x64 Windowsおよびx86 Windowsのコマンドプロンプトから実行することで、特定のシステムの環境変数が何に設定されているかを簡単に確認できます。
MDMarra

回答:


12

64ビットWindowsで起動された32ビットアプリケーションがシステム環境変数%ProgramFiles%または%commonprogramfiles%をアドレス指定すると、WoW64サブシステムはこれらの変数の値を変数%ProgramFiles(x86)%および "% commonprogramfiles(x86)%。したがって、たとえば、32ビットプログラムからアドレス指定する場合、%ProgramFiles%は「C:\ Program Files(x86)」として開かれます。

この動作は、32ビットソフトウェアと64ビットオペレーティングシステムの下位互換性を提供するレジスタリダイレクトシステムによって決定されます。32ビット環境は、アドレス指定しているデータが別の場所にあるにもかかわらず、32ビットプログラム用にエミュレートされています。

32ビットプログラムでこのようなリダイレクトを回避するには、対応するレジスタノードにアクセスするときに、%programfiles%または%COMMONPROGRAMFILES%(つまり、逆の場合)環境変数またはKEY_WOW64_64KEYフラグを使用する必要があります。


実際、リダイレクトを回避する代わりに、Windowsプロンプトからそれを実行しようとしています。たとえば、スクリプトを作成%ProgramFiles%してC:\Program Files32ビットで使用できるようにしたいのですがC:\Program Files (x86)、64 ビットでも使用できます。これはApacheとPHPの両方が機能する方法であり、これが「正しい」かどうかについてコメントすることはできませんが、気の利いた動作です。たとえばServerRoot "${ProgramFiles}\Zend\Apache2"、httpd.confで設定すると、Windowsのバージョンに関係なく、Zend / Apacheのインストール(64ビットのx86フォルダーにあります)が正しく検出されます。
ケン

3
私のマシンでは、32ビットコマンドシェルでecho %programfiles%、32ビットパスを返します。ただし、64ビットパスを指すProgramW6432という変数があります。
ハリージョンストン

これは私にはうまくいきません。すべてのこれらの変数は、同じパスを返す: var environmentVariables = new string[] { "%programfiles%", "%programfiles(x86)%", "%ProgramFiles%", "%commonprogramfiles%", "%COMMONPROGRAMFILES%" };
サイードNeamati

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.