mardi, février 23, 2010

Problème pour définir une variable d’environnement utilisant ProgramFiles(x86)


DiggIt! Enregistrer sur Del.icio.us

Je fais ce rapide billet suite à un problème de configuration dans un fichier cmd sous Windows 7 64 bits.

Windows 7 64 bits définit deux variables d’environnement et deux répertoires :

  • ProgramFiles(x86) qui pointe vers C:\Program Files (x86) : c’est là que sont installés normalement les programmes 32 bits.
  • ProgramFiles qui pointe vers  C:\Program Files qui s’appelle dans l’explorateur Programmes : c’est le répertoire qui contient les programmes 64 bits.

Cette distinction devait déjà exister sous Vista 64 bits. Elle n’est visible que si l’OS est 64 bits. Sur une version 32 bits, il n’existe que ProgramFiles.

Pour savoir si l’OS est 32 ou 64 bits, la variable d’environnement PROCESSOR_ARCHITECTURE peut être utilisée : elle prend les valeurs :

  • AMD64 pour du 64 bits
  • x86 pour du 32 bits

Cette variable existe déjà sous Windows XP et elle prend bien x86 sous un environnement 32 bits.

Les applications qui m’intéressent utilisent un cmd qui positionne les variables d’environnement  à son exécution (un mécanisme commun pour les applications NS-DK ou NatStar), le répertoire de base de mon application est sous %ProgramFiles% en 32 bits. Lors du passage sous 64 bits, le binaire restant un binaire 32 bits, il s’installe sous %ProgramFiles(x86)% j’ai donc cherché à redéfinir mes différentes variables d’environnement pour le cas du 64 bits. Je passe par une variable d’environnement local au cmd et temporaire PRGROOT afin d’éviter de modifier toutes les définitions.

J’ai commencé par faire :

if "%PROCESSOR_ARCHITECTURE%" == "AMD64" (
    SET PRGROOT=%programfiles(x86)%
)
if "%PROCESSOR_ARCHITECTURE%" == "x86" (
    SET PRGROOT=%programfiles%
)

Et là bizarrement, PRGROOT prend la valeur C:\Program Files (x86 sans la parenthèse fermante.

Après de nombreux essais, j’ai essayé la syntaxe (notez l’utilisation de guillemet autour de l’affectation complète)

if "%PROCESSOR_ARCHITECTURE%" == "AMD64" (
    SET "PRGROOT=%programfiles(x86)%"
)
if "%PROCESSOR_ARCHITECTURE%" == "x86" (
    SET PRGROOT=%programfiles%
)

Et là, tout se passe bien : je retrouve ma parenthèse fermante.

J’espère que ce billet sera utile à d’autres. On dirait qu’il y a un petit bug dans le cas du IF : il remplace %programfiles(x86)% par sa valeur puis, il fait l’affectation. Il prend la parenthèse fermante pour la fin du IF et non pas comme faisant partie de la valeur qu’il doit affecter. Les guillemet le force à considérer la parenthèse fermante comme faisant partie de l’affectation.


DiggIt! Enregistrer sur Del.icio.us

1 commentaires:

Anonyme a dit…

Bien utile - Merci
j'ai gagné un temps précieux
JV