Variables d'environnement utilisateur / système: les variables système remplacent-elles les variables utilisateur?

21

J'ai des droits élevés sur mon ordinateur portable mais pas des droits d'administrateur. Les droits d'administrateur sont requis pour modifier les variables d'environnement système. Je m'attendais à ce que si je créais une variable d'environnement utilisateur portant le même nom qu'une variable d'environnement système, la variable utilisateur remplacerait la variable système, mais cela ne semble pas être le cas.

Après avoir ajouté une variable utilisateur du même nom qu'une variable système, j'ai ouvert une toute nouvelle fenêtre cmd et utilisé la commande echo pour afficher la variable. Il m'a montré la valeur de la variable système au lieu de la valeur de la variable utilisateur.

Je voulais juste confirmer que c'est un comportement attendu et comprendre le raisonnement derrière cela. Je m'attendrais à ce que le paramètre utilisateur plus spécifique remplace celui du système.

J'ai Windows 7.

Tchad
la source
Lorsque vous modifiez des variables, vous devez souvent redémarrer complètement Windows. La modification d'une variable dans les paramètres ne modifiera pas les processus en cours d'exécution. Les nouveaux processus copient l'environnement des processus en cours d'exécution (selon la façon dont ils sont démarrés), donc le simple démarrage d'un processus ne signifie pas que vous obtenez un nouvel environnement.
Zoredache
J'ai redémarré et toujours lorsque j'exécute "echo% path%" à partir d'une fenêtre cmd.exe, il affiche ma variable env système, pas la valeur de la variable utilisateur. J'ai donc supprimé la variable utilisateur, o l'accès administrateur, changé ma variable de chemin d'accès système et le même cmd d'écho. La valeur env mise à jour a été affichée sans redémarrage. Cela me dit que les vars USER ne remplacent pas les vars du système et qu'un redémarrage n'est pas nécessaire. Neitehr est ce que j'attendais.
Chad
Quelle procédure a été utilisée pour ajouter une variable utilisateur du même nom qu'une variable système ? Quelque chose comme ça ?
JosefZ
JosefZ: oui, j'ai ajouté les deux variables d'environnement, l'une UTILISATEUR l'autre SYSTÈME, toutes les deux avec le même nom, en utilisant l'interface graphique Windows 7 similaire aux écrans affichés dans votre lien.
Chad
@Chad La réponse que vous avez acceptée n'est-elle pas exactement le contraire de votre expérience? Comment expliquez-vous cet écart?
RockPaperLizard

Réponses:

25

Selon l'article MSKB Variables d'environnement dans Windows NT :

Variables d'environnement utilisateur .... ont priorité sur les variables d'environnement système.

Une exception notable est la PATHvariable qui est un résultat combiné des variables système et utilisateur:

Le chemin est construit à partir du chemin système, qui peut être affiché dans le champ Variables d'environnement système de la boîte de dialogue Système. Le chemin utilisateur est ajouté au chemin système.

L'article traite également des exceptions identiques pour l'expansion des variables LibPathet Os2LibPathainsi que de la façon dont celles spécifiées dans autoexec.batsont traitées. Ces points sont susceptibles de trouver peu de pertinence dans les environnements typiques d'aujourd'hui.

Crédit à cette réponse SO

Je dis Rétablir Monica
la source
2
Est-il possible de faire précéder le chemin utilisateur du chemin système?
Qwerty
3

Tout ce que Twisty Impersonator a dit dans sa réponse est correct. L'idée que la variable de chemin utilisateur est ajoutée a été mise en évidence, et je pense que les conséquences de cette différence nécessitent un traitement supplémentaire.

Chemin =% Chemin% (Système); % Path% (utilisateur)

Lorsque vous exécutez un programme exécutable (ou tout script exécutable, par exemple .bat, .vbsetc.) vous n'avez pas besoin de fournir le chemin complet.

Par exemple, pour exécuter java, vous pouvez saisir n'importe lequel de ces éléments:

C:/Program Files (x86)/Java/jre6/bin/java -version

java.exe -version

java -version

Le premier exemple utilise un chemin d'accès complet. Cela utilisera toujours la version de Java sur ce chemin exact.

Le deuxième exemple passera par chacun des répertoires de la %Path%variable d'environnement, à la recherche d'un fichier exécutable nommé java.exe. Il exécutera le tout premier trouvé et arrêtera la recherche. S'il y a deux fichiers nommés java.exequelque part sur le %Path%, seul le premier trouvé est utilisé.

Le troisième exemple, comme le second, parcourra les répertoires répertoriés dans le %Path%. En outre, comme aucune extension de fichier n'a été fournie, une liste d'extensions de fichiers exécutables est ajoutée au nom du fichier, dans l'ordre spécifié dans la %PATHEXT%variable d'environnement. S'il y a plusieurs fichiers nommés java.com, java.exe, java.bat, etc. quelque part sur le %Path%, seul le premier trouvé est utilisé.

Vous pouvez voir la liste des extensions de chemin exécutables sur votre système en créant le fichier de commandes suivant:

@echo off
echo %PATHEXT%
pause

Sur ma machine, ce sont:

.COM; .EXE; .BAT; .CMD; .VBS; .VBE; .JS; .JSE; .WSF; .WSH; .MSC; .PY

Qu'est-ce que tout cela signifie?

En contraste à d' autres variables d'environnement, le chemin d'utilisateur ne vous permet pas de passer outre le chemin du système. L'exact opposé est le cas. Dans les exemples ci-dessus, il existe de nombreux cas où vous pouvez modifier la version par défaut de Java. Cependant, s'il existe déjà une version Java répertoriée dans le chemin d'accès système, c'est la version qui sera TOUJOURS trouvée en premier, car le chemin est recherché dans l'ordre, de gauche à droite, et le chemin utilisateur est ajouté à droite - côté main, avec le chemin du système sur la gauche.

Que puis-je faire à ce sujet?

Si vous n'avez pas accès aux variables d'environnement système, vous ne pouvez pas remplacer les programmes par défaut sur le chemin système en utilisant le chemin utilisateur. (En fait, il doit en être ainsi, sinon certains programmes cesseraient de fonctionner correctement et cela ouvrirait votre système à la falsification de logiciels malveillants. Personne ne veut ça.)

Au lieu de cela, vous devez utiliser un chemin d'accès complet si vous devez utiliser une version spécifique.

JonathanDavidArndt
la source
1
Est-il possible de faire précéder le chemin utilisateur du chemin système?
Qwerty
1
Ce serait un bon sujet pour une autre question. (Une recherche rapide sur ce site n'a pas révélé quoi que ce soit immédiatement pertinent.) N'hésitez pas à poser une nouvelle question, et à poster un lien ici dans les commentaires!
JonathanDavidArndt