Pourquoi Windows ne peut-il pas gérer une variable d'environnement dans Path?


44

Mon collègue et moi avons des postes de travail Dell identiques avec Windows XP Professionnel Édition x64 installée.

La variable d'environnement My Path commence par:

%JAVA_HOME%\bin;...

La variable Path de mon collègue inclut le même répertoire, spécifié à l'aide de la même variable d'environnement, mais ce n'est pas le premier élément de son chemin.

Si j'accède aux propriétés système -> variables d'environnement et que je change la valeur de ma variable JAVA_HOME, la version de java trouvée à partir de la ligne de commande change comme prévu. Il s’agit de démarrer une toute nouvelle fenêtre de console afin d’être sûr de prendre en compte les modifications.

Mais sur la machine de mon collègue, ce n'est pas le cas. Il continue à retrouver sa version précédente de Java jusqu'à ce qu'il affiche sa variable Path et l'enregistre (même s'il ne la modifie pas). (Encore une fois, cela se produit lorsque vous démarrez une nouvelle fenêtre de console.)

J'observe cette incohérence sous Windows depuis environ 6 mois et je suis très curieux à ce sujet. Nous avons trop de versions de Windows dans notre bureau, j'ai donc rarement eu la chance de voir cela se produire sur deux ordinateurs exécutant exactement la même version de système d'exploitation, jusqu'à présent.

Qu'est-ce qui cause ça? Pourquoi sa machine ne réévalue-t-elle pas Path avec le nouveau JAVA_HOME, alors que la mienne le fait?

(Est-ce parce que ce n'est pas la première chose sur le chemin? Si oui, comment pourrait-il en être ainsi et pourquoi? Je ferais plus de tests pour vérifier, mais je pense qu'il en a maintenant assez et qu'il aimerait se remettre au travail .)


9
Pour tous ceux qui votent pour la fermeture (3 pour le moment) ... s'il y a un dup quelque part, un commentaire m'indiquant que ce serait bien serait bien. Si ce n'est pas une dupe ... alors il serait bien que vous me disiez ce qui ne va pas avec cette question.
skiphoppy

1
Peut-être parce que c'est plus une question de système que de programmation, bien que cela ait un impact direct sur la programmation, c'est pourquoi je ne vote pas pour la fermer ... :)

9
Attenion close-nazis: J'aimerais faire valoir que si une question était appropriée sur Stack Overflow avant l'arrivée de superuser.com et serverfault.com, elle l'est toujours aujourd'hui. Ceci est une question de programmation.
skiphoppy

Voulez-vous dire que les programmeurs ne sont que des utilisateurs de Windows, qui peuvent avoir ce problème? Tais-toi, programmeur-nazi! Deuxièmement, avant l’arrivée d’un site de questions-réponses plus approprié, vous n’aviez pas la possibilité de poser une question ici. L'hospitalité de SO ne doit pas être un argument pour en abuser.
Val

Je regarde ceci dans Windows 10 - la substitution de variable dans PATH échouait par intermittence . Accéder aux variables d’environnement et enregistrer (sans modification), puis ouvrir une nouvelle invite CMD a résolu le problème.
Thomas W

Réponses:


37

Votre chemin est la concaténation du chemin système suivi du chemin utilisateur. De plus, les variables d'environnement système peuvent ne pas contenir de références aux variables d'environnement utilisateur et aucune de ces références ne sera développée. Pour obtenir le résultat souhaité, insérez la référence à% JAVA_HOME% dans la variable d’environnement utilisateur PATH ou créez-en une si elle n’existait pas encore.

Peut-être qu'un exemple simplifié rendra cela plus clair. Supposons que l’environnement SYSTEM soit

ProgramFiles = C:\Program Files
SystemRoot = C:\WINDOWS
PATH = %SystemRoot%\SYSTEM32

et l'environnement de l'utilisateur JSmith est

JAVA_HOME = %ProgramFiles%\Java\bin
USERPROFILE = C:\USERS\JSmith
PATH = %JAVA_HOME%\bin;%USERPROFILE%\bin

alors le chemin résultant serait

C:\WINDOWS\SYSTEM32;C:\Program Files\Java\bin;C:\Users\JSmith\bin

comme voulu.


3
Mon système avait des variables d'utilisateur env avec le même nom que certaines variables d'environnement système. Faire écho à PATH ne les développerait pas - après avoir lu ceci, j'ai supprimé les variables utilisateur en double car je me demandais si elles avaient été captées avec priorité (mais ne pouvaient pas être développées). Cela a maintenant fonctionné pour moi - merci beaucoup. :)
Michael

Existe-t-il un moyen via Powershell d’obtenir le PATH original non développé? J'espérais ajouter à PATH tout en préservant les variables d'environnement non développées qu'il contient.
CMCDragonkai

Résolu avec l'aide d'une autre question. Ecrivez un script PowerShell
CMCDragonkai

16

Vérifiez dans le registre Windows sous cette clé:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Environment

SI la variable d'environnement doit être développée (ici:% JAVA_HOME%)

alors la variable doit être définie en tant que valeur REG_EXPAND_SZ .

Si vous utilisez reg.exe via la ligne de commande pour ajouter / modifier des valeurs de registre, le type par défaut est REG_SZ. Spécifiez le type REG_EXPAND_SZ à l'aide de l' reg add /t REG_EXPAND_SZoption.


Eh oui ... c'est un de ces paramètres que j'ai toujours l'impression d'oublier ... registre embêtant ;-)
Eddie B

9

Il existe un problème certain avec le développement de variables d’environnement au sein de la variable PATH lorsque la variable se développe en un chemin contenant des espaces.

Nous avons créé nos propres variables de niveau système, telles que "OUR_ROOT = c: \ MyRoot", puis nous les avons utilisées dans le système PATH, telles que "PATH =;% OUR_ROOT% \ bin;". et qui est étendu correctement à "PATH =; c: \ MyRoot \ bin;". Jusqu'à présent, pas de problème.

Mais sous Windows 7 (32 bits), un produit s’est installé et a créé les variables d’environnement système suivantes:

STUDIO_BIN=C:\program files\Company Name\Product Name 10.4\bin

et il l'a ajouté à la variable système PATH:

PATH=<other path elements>;%STUDIO_BIN%;<more path elements>

Mais les valeurs PATH affichées dans CMD contenaient "% STUDIO_BIN%;" et non le chemin étendu. La valeur dans Poste de travail> Propriétés> Avancé> Env.Vars reste également non développée. Cela signifiait que je ne pouvais pas exécuter de programmes nécessitant une DLL dans ce répertoire.

En changeant simplement STUDIO_BIN (via Poste de travail> Propriétés> Avancé ...> Env Vars) en un nom sans espaces incorporés:

STUDIO_BIN=C:\ProductName\bin

puis en redémarrant la fenêtre CMD, le PATH est maintenant:

PATH=<other path elements>;C:\ProductName\bin;<more path elements>

Une autre solution consiste à éditer suffisamment la variable système que vous utilisez dans PATH à l'aide de la boîte de dialogue Poste de travail> Propriétés> Avancé ...> Variables d'environnement. J'ai essayé d'ajouter un caractère et de le supprimer pour effectuer un "changement", puis OK, une nouvelle invite CMD a été lancée et PATH n'a PAS été correctement développé. J'ai ensuite essayé de supprimer une partie du chemin afin qu'il soit

STUDIO_BIN=C:\Program Files\Company Name

(en omettant "Nom du produit 10.4") et puis voilà, la prochaine invite CMD a montré PATH avec STUDIO_BIN correctement développé!

Bizarrement, si je suis rentré et que j'ai ajouté le "Nom du produit 10.4" à STUDIO_BIN (y compris tous les espaces qui étaient à l'origine avant que je ne commence à le faucher), PATH était toujours correctement développé.

De toute évidence, le contenu de la variable PATH ayant été suffisamment modifié, il subit un traitement supplémentaire dans la boîte de dialogue Variables d'environnement qui lui permet de fonctionner. Traitement non effectué lors de l'ajout de la variable par le programme d'installation du produit (qui vient probablement de modifier directement PATH dans le registre).

Je suis presque sûr que c'était aussi un problème avec XP. Cela a juste refait surface pour moi dans Windows 7 alors que je construisais une nouvelle machine de développement. Apparemment, cela n’a pas été corrigé par Microsoft.

Apparemment, même les variables définies par MS, telles que% ProgramFiles%, ne se développeront pas correctement dans PATH.

Cette page fournit une réponse possible si vous définissez PATH via la ligne de commande ou le fichier de traitement par lots. (Placez la commande entière après SET entre guillemets.) Je ne sais pas quel programme d'installation utilisé par le produit que j'ai installé a été utilisé pour définir les variables d'environnement, mais il est évident que tout le traitement nécessaire pour développer correctement les chemins d'accès avec des espaces a été pris.

Donc, pour résumer, vous pouvez soit:

  • changer les chemins (et déplacer tous les fichiers associés) en chemins sans espaces, ou

  • éditez les variables qui ne parviennent pas à se développer dans la boîte de dialogue Variables d'environnement (modifiez-les suffisamment pour qu'elles soient traitées correctement - je ne suis pas certain que cela suffise).


7

Je l'ai demandé sur les forums Microsoft en mars 2009 et je ne l'ai jamais résolu:

Comment utiliser% ProgramFiles% dans la variable d'environnement Path? :


J'essaie d'ajouter un dossier à la variable d'environnement Path du système.

Je veux ajouter % ProgramFiles% \ SysInternals

à la variable de chemin existante:

C: \ PROGRA ~ 1 \ Borland \ Delphi5 \ Projets \ Bpl; C: \ PROGRA ~ 1 \ Borland \ Delphi5 \ Bin; % SystemRoot% \ system32; % SystemRoot% ;% SystemRoot % \ System32 \ Wbem; C: \ Fichiers de programme \ Microsoft SQL Server \ 80 \ Outils \ BINN; C: \ Fichiers de programme \ Microsoft SQL Server \ 80 \ Outils \ Binn \; C: \ Fichiers de programme \ Microsoft SQL Server \ 90 \ Outils \ binn \; C: \ Programmes \ Microsoft SQL Server \ 90 \ DTS \ Binn \; C: \ Programmes \ Microsoft SQL Server \ 90 \ Outils \ Binn \ VSShell \ Common7 \ IDE \; C: \ Programmes \ Microsoft Visual Studio 8 \ Common7 \ IDE \ PrivateAssemblies \;% SYSTEMROOT % \ System32 \ WindowsPowerShell \ v1.0 \

Donc, je vais à l'endroit où vous le modifiez:

texte alternatif

Et j'ajoute ma variable au chemin:

% ProgramFiles % \ SysInternals; C: \ PROGRA ~ 1 \ Borland \ Delphi5 \ Projects \ Bpl; (couper)

Ensuite, en ouvrant une nouvelle fenêtre d'invite de commande, la variable d'environnement n'est pas remplacée par sa valeur réelle:

Path =% ProgramFiles % \ SysInternals; C: \ PROGRA ~ 1 \ Borland \ Delphi5 \ Projects \ Bpl (snip)>

Ce que vous pouvez voir dans la capture d'écran suivante:

texte alternatif


Mais pour répondre à votre question: je ne sais pas. On dirait que cela ne peut pas être fait.


5

il existe deux niveaux de variables d'environnement, global et utilisateur. S'il a% Java_home% défini en tant que variable d'environnement utilisateur mais qu'il est en train de modifier la variable globale, il ne verra aucune différence.


2

Assurez-vous qu'il n'y a pas d'espace dans PATH lorsque vous définissez vos propres variables d'environnement utilisateur. par exemple: C: \ GNAT \ bin; C: \ GNAT \ include ne fonctionnera pas, à cause de l’espace entre les ";" et "C: \ GNAT \ include".


2

Ajoutez les variables d'environnement lorsque vous êtes connecté à la session / console à l'aide de MSTSC.

Redémarrez la machine et vous constaterez que vos variables d'environnement auront persisté.

Il semble y avoir une bizarrerie dans le système d'exploitation en fonction de la manière dont vous avez été connecté à la machine lorsque vous avez tenté de modifier la variable d'environnement.


1

Cela peut être lié à la fonctionnalité "d'expansion de variable d'environnement retardée" (ou à son absence), ou peut-être pouvez-vous en tirer parti pour toujours avoir une solution correcte.

à partir d'une invite de commande

set /? 

et lisez la section "Développement de variables d’environnement retardées", qui inclut un petit exemple pour tester

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "%VAR%" == "after" @echo If you see this, it worked
)

Si vous n'obtenez pas la ligne d'écho, cela pourrait l'expliquer ...

Si, toutefois, vous démarrez votre cmd.exe avec l'option / V, vous pouvez utiliser "!" au lieu de "%", ce qui change le comportement

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "!VAR!" == "after" @echo If you see this, it worked
)

Pour moi (fonctionnant sous XP), le premier script ne fonctionnait pas, mais la deuxième version le faisait (avec cmd.exe / V)


1

J'ai eu le même problème, et je sais comment le réparer, c'est nul.

Éditez simplement votre PATH à nouveau, mais n’effectuez aucune modification et ré-enregistrez PATH. Pour une raison quelconque, toutes les références de variable d’environnement imbriquées sont réévaluées.

Si cela ne fonctionne pas, faites-le quelques fois de plus, d'une manière ou d'une autre, cela se fera tout seul.


1

Je crois que Windows ne parvient pas à développer une variable dans PATH car il pense ce qu’elle n’a pas encore défini. Considérer:

REM Ensure variable is undefined
SET UNDEFINED=
REM And then try to expand it
ECHO UNDEFINED=%UNDEFINED%

Cette hypothèse est conforme à mon autre observation - ajouter %ProgramFiles%\Somethingaux utilisateurs PATH aboutira toujours à une expansion attendue de %ProgramFiles%, étant donné qu’elle a été définie dans l’environnement de la machine au moment de la notification de modification de variable (ordre de chargement dû - MACHINE, puis USER). Mais lorsque vous modifiez l'environnement de la machine, les variables correctes ne se développent qu'au démarrage (pour l'instant, je ne sais pas du tout comment et pourquoi cela ne se produit pas régulièrement).


1

Vous devez tenir compte de l'ordre dans lequel les variables sont définies lors de la connexion. Si vous essayez d'utiliser une variable avant qu'elle ne soit définie, elle apparaîtra comme chaîne vide.

Le PATH effectif est la concaténation de la variable PATH de l'utilisateur suivie de la variable PATH globale.

Les variables utilisateur sont définies avant les variables globales, vous ne pouvez donc pas utiliser de variables globales dans votre variable utilisateur PATH. De plus, les variables étant définies dans l'ordre alphabétique, vous ne pouvez pas utiliser de variables triées avant PATH.

(Ceci s'applique au moins à Windows 7. Je ne l'ai pas testé sur les versions les plus récentes.)


0

Peut-être que vous le faites mal?

J'ai essayé avec Windows XP Pro SP3 (32 bits). J'ai un chemin avec plusieurs occurrences de %JAVA_HOME%(et %JAVAFX_HOME%, etc.). Je vais en ligne de commande, tapez PATH, je vois les variables développées. Bien.

Je change la valeur de JAVA_HOME. Retour à la même fenêtre de ligne de commande, PATHencore une fois, même valeur ... comme prévu (par expérience!).

J'ouvre une nouvelle fenêtre de ligne de commande, tapez PATH, gotcha, je vois la nouvelle valeur.

Je ne sais pas quel est le mécanisme exact, mais il semble que tout programme en cours, y compris cmd.exe, capture les valeurs des variables d’environnement au moment du démarrage et ne regarde pas en arrière ... écoute pour les changements env, pas trop sûr cependant).

Cela peut être perçu comme une fonctionnalité, un bug ou une gêne, mais c'est ainsi que cela fonctionne. Au moins, contrairement à Win9X, nous n'avons pas à redémarrer l'ordinateur! Et contrairement à NT times (IIRC), vous n’avez pas à vous déconnecter et à revenir en arrière.

Pourquoi cette incohérence? Les voies de Microsoft sont impénétrables ... :-P


Ce n'est pas ça Après le changement, nous testons dans une nouvelle fenêtre de commande. Nous sommes conscients du fait que la modification des valeurs système ne modifie pas les valeurs des processus en cours d'exécution.
skiphoppy

OK, d'où le "peut-être" ... :-) Et mon explication ne couvre pas l'incohérence, mais pourrait être utile à un débutant ...: -PI voulait surtout souligner que l'extension variable fonctionne partout dans le chemin. .. pour certains systèmes! (tous ceux que j'ai utilisés ... toujours 32bit).

0

J'ai résolu la configuration des variables d'environnement dans Système> Paramètres avancés> Variables d'environnement .

Il y a deux panneaux, les variables utilisateur et globale (l'utilisateur est votre nom d'utilisateur Windows) et les variables système sont des variables globales. Par conséquent, si vous définissez les variables "Nouveau" à partir de l'utilisateur, telles que JAVA_HOMEet placez votre chemin ci-dessous, vous définissez des variables même si votre chemin global avoir des fichiers de programme dans le dossier.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.