% ProgramFiles% perbedaan pada Windows 64bit

8

Dari prompt perintah, saya mendapatkan yang berikut:

>echo %ProgramFiles%
C:\Program Files

Namun, beberapa aplikasi (PHP dalam contoh ini, meskipun saya telah melihat perilaku yang sama dari dalam httpd.conf Apache), yaitu:

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

Kenapa ini?

Latar Belakang: Saya sedang mengembangkan skrip yang agnostik dari OS host menjadi 32bit atau 64bit, dan untuk file konfigurasi ini berfungsi dengan baik. Pada sistem 32bit, %ProgramFiles%adalah "C: \ Program Files", dan pada sistem 64bit yang %ProgramFiles%tampaknya sama kembali C:\Program Files (x86). Saya hanya ingin tahu mengapa hal yang sama tidak berlaku ketika saya mencobanya dari command prompt Windows (atau di bar explorer, dll.). Apakah ada command prompt 64bit atau sesuatu?

ken
sumber
Di kedua lingkungan, %programfiles%kembali C:\Program Files(pada konfigurasi default Windows). Pada versi x64 Windows, %programfiles(x86)kembali C:\Program Files (x86). Tidak yakin mengapa php mengembalikan sesuatu yang bertentangan dengan itu, tetapi Anda dapat dengan mudah memverifikasi variabel lingkungan untuk sistem tertentu diatur dengan menjalankan setdari prompt perintah pada x64 Windows dan x86 Windows.
MDMarra

Jawaban:

12

Ketika aplikasi 32-bit diluncurkan dalam Windows 64-bit membahas variabel lingkungan sistem% ProgramFiles% atau% commonprogramfiles%, subsistem WoW64 menggantikan nilai-nilai variabel ini dengan nilai-nilai variabel% ProgramFiles (x86)% dan "% commonprogramfiles (x86)%. Dengan demikian, misalnya,% ProgramFiles% akan dibuka sebagai "C: \ Program Files (x86)" ketika menangani dari program 32-bit.

Perilaku ini ditentukan oleh sistem redirection register yang menyediakan kompatibilitas mundur dari perangkat lunak 32-bit dengan sistem operasi 64-bit. Lingkungan 32-bit ditiru untuk program 32-bit walaupun fakta bahwa data yang mereka tangani terletak di tempat yang berbeda.

Untuk menghindari pengalihan seperti itu dalam program 32-bit, Anda harus menggunakan% programfiles% atau% COMMONPROGRAMFILES% (yaitu dengan kasus terbalik) variabel lingkungan atau bendera KEY_WOW64_64KEY ketika mengakses node register yang sesuai.

justin0
sumber
Sebenarnya, alih-alih menghindari pengalihan, saya mencoba untuk membuatnya dari prompt Windows; misalnya, saya ingin skrip %ProgramFiles%dan menggunakannya C:\Program Filespada 32bit dan belum digunakan C:\Program Files (x86)pada 64bit. Ini adalah cara di mana Apache dan PHP berfungsi, dan sementara saya tidak bisa berkomentar apakah ini "benar", itu adalah perilaku yang baik. Sebagai contoh, saya dapat mengatur ServerRoot "${ProgramFiles}\Zend\Apache2"di httpd.conf, dan itu akan dengan benar menemukan Zend / Apache menginstal (yang ada di folder x86 pada 64bit) terlepas dari versi Windows.
ken
3
Di komputer saya, dalam shell perintah 32-bit, echo %programfiles%masih mengembalikan path 32-bit. Namun, ada variabel bernama ProgramW6432 yang menunjuk ke jalur 64-bit.
Harry Johnston
Ini tidak bekerja untuk saya. Semua variabel ini mengembalikan jalur yang sama: var environmentVariables = new string[] { "%programfiles%", "%programfiles(x86)%", "%ProgramFiles%", "%commonprogramfiles%", "%COMMONPROGRAMFILES%" };
Saeed Neamati