% ProgramFiles% khác biệt trên Windows 64 bit


8

Từ một dấu nhắc lệnh, tôi nhận được như sau:

>echo %ProgramFiles%
C:\Program Files

Tuy nhiên, một số ứng dụng (PHP trong trường hợp này, mặc dù tôi đã thấy hành vi tương tự từ bên trong httpd.conf của Apache), đó là:

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

Tại sao lại thế này?

Bối cảnh: Tôi đang phát triển các tập lệnh không rõ hệ điều hành của máy chủ lưu trữ là 32 bit hoặc 64 bit và đối với các tệp cấu hình, điều này hoạt động rất tốt. Trên hệ thống 32 bit, %ProgramFiles%là "C: \ Chương trình tệp" và trên hệ thống 64 bit %ProgramFiles%có vẻ như trả về C:\Program Files (x86). Tôi chỉ tò mò tại sao điều tương tự không đúng khi tôi thử nó từ dấu nhắc lệnh của Windows (hoặc trong thanh thám hiểm, v.v.). Có một dấu nhắc lệnh 64 bit hay cái gì đó không?


Trong cả hai môi trường, %programfiles%trả về C:\Program Files(trên cấu hình mặc định của Windows). Trên các phiên bản x64 của Windows, %programfiles(x86)trả về C:\Program Files (x86). Không chắc chắn tại sao php lại trả về một cái gì đó trái ngược với điều đó, nhưng bạn có thể dễ dàng xác minh các biến môi trường cho một hệ thống nhất định được đặt bằng cách chạy settừ dấu nhắc lệnh trên x64 Windows và x86 Windows.
MDMarra

Câu trả lời:


12

Khi một ứng dụng 32 bit được khởi chạy trong Windows 64 bit xử lý các biến môi trường hệ thống% ProgramFiles% hoặc% commonprogramfiles%, hệ thống con WoW64 thay thế các giá trị của các biến này bằng các giá trị của biến% ProgramFiles (x86)% và "% commonprogramfiles (x86)%. Vì vậy, chẳng hạn,% ProgramFiles% sẽ được mở dưới dạng "C: \ Program Files (x86)" khi đánh địa chỉ từ chương trình 32 bit.

Hành vi này được xác định bởi hệ thống chuyển hướng đăng ký cung cấp khả năng tương thích ngược của phần mềm 32 bit với hệ điều hành 64 bit. Môi trường 32 bit được mô phỏng cho các chương trình 32 bit mặc dù thực tế là dữ liệu họ đang xử lý được đặt ở một nơi khác.

Để tránh chuyển hướng như vậy trong chương trình 32 bit, bạn nên sử dụng các biến môi trường% chương trình% hoặc% COMMONPROGRAMFILES% (nghĩa là với trường hợp ngược) hoặc cờ KEY_WOW64_64KEY khi truy cập các nút đăng ký tương ứng.


Trên thực tế, thay vì tránh chuyển hướng, tôi đang cố gắng thực hiện nó từ một dấu nhắc của Windows; chẳng hạn, tôi muốn có thể viết kịch bản %ProgramFiles%và sử dụng nó C:\Program Filestrên 32 bit và chưa sử dụng C:\Program Files (x86)trên 64 bit. Đây là cách mà cả Apache và PHP hoạt động và trong khi tôi không thể nhận xét liệu điều này có "đúng" hay không, thì đó là một hành vi tiện lợi. Ví dụ: tôi có thể đặt ServerRoot "${ProgramFiles}\Zend\Apache2"trong httpd.conf và nó sẽ tìm chính xác cài đặt Zend / Apache (nằm trong thư mục x86 trên 64 bit) bất kể phiên bản Windows.
ken

3
Trên máy của tôi, trong vỏ lệnh 32 bit, echo %programfiles%vẫn trả về đường dẫn 32 bit. Tuy nhiên, có một biến có tên ProgramW6432 trỏ đến đường dẫn 64 bit.
Harry Johnston

Điều này không làm việc cho tôi. Tất cả các biến này trả về cùng một đường dẫn: var environmentVariables = new string[] { "%programfiles%", "%programfiles(x86)%", "%ProgramFiles%", "%commonprogramfiles%", "%COMMONPROGRAMFILES%" };
Saeed Neamati

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.