% ProgramFiles% differenze su Windows a 64 bit


8

Da un prompt dei comandi, ottengo quanto segue:

>echo %ProgramFiles%
C:\Program Files

Tuttavia, alcune applicazioni (PHP in questo caso, anche se ho visto lo stesso comportamento all'interno di httpd.conf di Apache), è:

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

Perchè è questo?

Sfondo: sto sviluppando script che sono agnostici del sistema operativo host a 32 bit o 64 bit, e per i file di configurazione funziona alla grande. Su un sistema a 32 bit, %ProgramFiles%è "C: \ Programmi" e su un sistema a 64 bit che %ProgramFiles%sembra restituire lo stesso C:\Program Files (x86). Sono solo curioso di sapere perché lo stesso non è valido quando lo provo dal prompt dei comandi di Windows (o nella barra di esplorazione, ecc.). Esiste un prompt dei comandi a 64 bit o qualcosa del genere?


In entrambi gli ambienti, %programfiles%restituisce C:\Program Files(su una configurazione predefinita di Windows). Nelle versioni x64 di Windows, %programfiles(x86)ritorna C:\Program Files (x86). Non sei sicuro del perché php stia restituendo qualcosa di contrario, ma puoi facilmente verificare quali sono le variabili ambientali per un determinato sistema eseguendo setda un prompt dei comandi su Windows x64 e Windows x86.
MDMarra,

Risposte:


12

Quando un'applicazione a 32 bit avviata in una finestra a 64 bit indirizza le variabili di ambiente di sistema% ProgramFiles% o% commonprogramfiles%, il sottosistema WoW64 sostituisce i valori di queste variabili con i valori delle variabili% ProgramFiles (x86)% e "% commonprogramfiles (x86)%. Pertanto, ad esempio,% ProgramFiles% verrà aperto come "C: \ Programmi (x86)" quando si indirizza da un programma a 32 bit.

Questo comportamento è determinato dal sistema di reindirizzamento del registro che fornisce la compatibilità con le versioni precedenti del software a 32 bit con i sistemi operativi a 64 bit. L'ambiente a 32 bit viene emulato per i programmi a 32 bit anche se i dati a cui si stanno indirizzando si trovano in una posizione diversa.

Per evitare tale reindirizzamento in un programma a 32 bit, è necessario utilizzare le variabili di ambiente% programfiles% o% COMMONPROGRAMFILES% (ovvero con maiuscolo) o il flag KEY_WOW64_64KEY quando si accede ai nodi di registro corrispondenti.


In realtà, invece di evitare il reindirizzamento, sto provando a metterlo in atto da un prompt di Windows; ad esempio, mi piacerebbe essere in grado di eseguire script %ProgramFiles%e utilizzarlo C:\Program Filessu 32 bit e tuttavia utilizzare C:\Program Files (x86)su 64 bit. Questo è il modo in cui funzionano sia Apache che PHP, e anche se non posso commentare se questo è "corretto", è un comportamento elegante. Ad esempio, posso impostare ServerRoot "${ProgramFiles}\Zend\Apache2"in httpd.conf e troverà correttamente l'installazione di Zend / Apache (che si trova nella cartella x86 a 64 bit) indipendentemente dalla versione di Windows.
Ken,

3
Sulla mia macchina, in una shell dei comandi a 32 bit, echo %programfiles%restituisce comunque il percorso a 32 bit. Esiste, tuttavia, una variabile denominata ProgramW6432 che punta al percorso a 64 bit.
Harry Johnston,

Questo non funziona per me. Tutte queste variabili restituiscono lo stesso percorso: var environmentVariables = new string[] { "%programfiles%", "%programfiles(x86)%", "%ProgramFiles%", "%commonprogramfiles%", "%COMMONPROGRAMFILES%" };
Saeed Neamati,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.