Pourquoi ma ligne de commande Windows 8 ne met-elle pas à jour son chemin

21

J'avais besoin d'ajouter une nouvelle entrée à ma variable PATH. C'est une activité courante pour moi dans mon travail, mais j'ai récemment commencé à utiliser Windows 8. J'ai supposé que le processus serait similaire à Windows 7, Vista, XP ...

Voici ma séquence d'événements:

  1. Ouvrez les propriétés du système (Démarrer-> [tapez "Panneau de configuration"] -> Panneau de configuration \ Système et sécurité \ Système -> Paramètres système avancés -> Variables d'environnement)
  2. Ajoutez le nouveau chemin au début de ma variable USER PATH (C: \ dev \ Java \ apache-ant-1.8.4 \ bin;)
  3. Ouverture d'une invite de commande (Démarrer -> [tapez "invite de commande" entrez] -> [tapez "chemin" entrez]

Ma nouvelle entrée de chemin n'est pas disponible (voir l'image et la vidéo ci-jointes). J'ai dupliqué exactement le même processus sur une machine Windows 7 et cela a fonctionné.

Capture d'écran des variables d'environnement

MODIFIER

Vidéo sur les variables d'environnement et l'invite de commande de Windows 8

MODIFIER

Ce n'est certainement pas le comportement de Windows 7. Regardez cette vidéo pour voir le comportement que j'attends de travailler dans Windows 7. http://youtu.be/95JXY5X0fII

EDIT 31/05/2013

Donc, après beaucoup de frustration, j'ai écrit une petite application C # pour tester l' WM_SETTINGCHANGEévénement. Ce code reçoit l'événement dans Windows 7 et Windows 8. Cependant, dans Windows 8 sur mon système, je n'obtiens pas le chemin correct; mais je le fais dans Windows 7. Cela ne pouvait pas être reproduit dans d'autres systèmes Windows 8.

Voici le code C #.

using System;
using Microsoft.Win32;

public sealed class App
{
    static void Main()
    {
        SystemEvents.UserPreferenceChanging += new UserPreferenceChangingEventHandler(OnUserPreferenceChanging);

        Console.WriteLine("Waiting for system events.");
        Console.WriteLine("Press <Enter> to exit.");
        Console.ReadLine();
    }

    static void OnUserPreferenceChanging(object sender, UserPreferenceChangingEventArgs e)
    {
        Console.WriteLine("The user preference is changing. Category={0}", e.Category);
        Console.WriteLine("path={0}", System.Environment.GetEnvironmentVariable("PATH"));
    }
}

OnUserPreferenceChanging est équivalent à WM_SETTINGCHANGE

Programme C # exécuté dans Windows 7 (vous pouvez voir l'événement se produire et il choisit le bon chemin).

Programme C # exécuté sous Windows 8 (vous pouvez voir l'événement se produire, mais le mauvais chemin).

Il y a quelque chose dans mon environnement qui précipite ce problème. Cependant, est-ce un bug de Windows 8?

EDIT 2014-04-28

En raison de cela et de plusieurs autres problèmes, nous n'utilisons plus Windows 8 sur le bureau. Nous n'avons pas d'environnement pour continuer à tester et expérimenter ce problème. Il n'y a toujours pas de réponse ou de résolution à ce problème pour nous. Les réponses ci-dessous n'ont pas résolu notre problème.

mawcsco
la source
2
Je pense que vous devez redémarrer après avoir apporté les modifications pour qu'elles prennent effet.
Enigma
@Enigma Pourquoi? Je n'ai pas eu besoin de redémarrer sous Windows 7, Vista, XP, 2000 ...
mawcsco
@mawcsco Vous l'avez fait en 7 au moins. L'ouverture des invites de commande à partir du menu Démarrer démarre avec l'environnement du shell Explorer, qui a été chargé lorsque vous vous êtes connecté. Vous devez soit tuer / redémarrer l'explorateur, vous déconnecter ou vous reconnecter, soit redémarrer le système.
Dark Android
1
@Enigma Un redémarrage ne devrait pas être nécessaire. serverfault.com/questions/8855/…
mawcsco
1
Je viens de vérifier cela sur Windows 7 et Windows 8: dans les deux cas, la nouvelle variable d'environnement était visible cmdlors du lancement d'une nouvelle instance. Bien sûr, le déjà en cours d'exécution cmdn'a pas obtenu l'environnement mis à jour.
Alexey Ivanov

Réponses:

7

Si vous lancez l'invite de commande à partir du menu Démarrer ou d'un raccourci sur votre barre des tâches, vous devez soit:

  • Redémarrez explorer. Tuez-le et relancez-le.
  • Déconnectez-vous et reconnectez-vous (qui se relance efficacement explorer).
  • Redémarrez le système (qui redémarre également efficacement explorer).

L'environnement ne se met pas à jour immédiatement car les environnements sont hérités de leur processus parent, à l'exception de explorer, qui est démarré par le système lors de la connexion. Voici comment il se comporte sur mon système Windows 7.

Ainsi, la modification des variables d'environnement met à jour les clés de registre, mais ces clés ne sont pas relues jusqu'à ce que le système doive créer un nouvel environnement de connexion pour un processus en cours de lancement. La plupart du temps, cela ne se produit pas parce que les processus sont les enfants d'un processus qui a déjà un environnement, donc l'environnement est hérité.

Dark Android
la source
2
Absolument faux pour Windows 7. Voir la vidéo que j'ai liée dans mon post ci-dessus.
mawcsco
1
Huh. Vous avez certainement raison, bien que mes modifications ne soient définitivement pas appliquées immédiatement aux nouvelles fenêtres de console sur Win 7 auparavant. Je ne me souviens cependant pas de mon flux de travail exact. Je jouerai avec mon système Win 8 quand je rentrerai à la maison si personne n'a de réponse pour vous d'ici là.
Dark Android
5
Si vous avez modifié les variables d'environnement à l'aide de la boîte de dialogue Propriétés système, les modifications sont appliquées immédiatement à l'instance Explorer en cours d'exécution et tous les processus démarrés par la suite obtiennent le nouvel environnement. Les processus déjà en cours d'exécution ne mettent pas automatiquement à jour leurs variables d'environnement à moins qu'ils ne gèrent le WM_SETTINGCHANGEmessage.
Alexey Ivanov
1
Mec, cela m'a aidé à comprendre le problème que j'avais de toute façon. J'utilise AutoHotkey pour lancer une invite de commande, et cela ne fonctionnait que lorsque j'ai redémarré autohotkey!
Moss
1
@mawcsco Cela a fonctionné pour moi, j'utilise Windows 7.
laike9m
3

De: http://support.microsoft.com/kb/104011 via /server//q/8855/158027

...

Cependant, notez que les modifications apportées aux variables d'environnement n'entraînent pas de changement immédiat. Par exemple, si vous démarrez une autre invite de commandes après avoir effectué les modifications, les variables d'environnement refléteront les valeurs précédentes (et non les valeurs actuelles). Les modifications ne prennent effet que lorsque vous vous déconnectez, puis vous reconnectez.

Pour effectuer ces modifications sans avoir à vous déconnecter, diffusez un message WM_SETTINGCHANGE à toutes les fenêtres du système, afin que toutes les applications intéressées (telles que l'Explorateur Windows, le Gestionnaire de programmes, le Gestionnaire des tâches, le Panneau de configuration, etc.) puissent effectuer une mise à jour. PLUS D'INFORMATION


Par exemple, sur les systèmes Windows NT, le fragment de code suivant doit propager les modifications apportées aux variables d'environnement utilisées dans l'invite de commandes:

SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
    (LPARAM) "Environment", SMTO_ABORTIFHUNG,
    5000, &dwReturnValue);

Aucune des applications fournies avec Windows 95 et Windows 98, y compris l'Explorateur Windows et le Gestionnaire de programmes, ne répond à ce message. Ainsi, bien que cet article puisse techniquement être implémenté sur Windows 95 et Windows 98, il n'y a aucun effet sauf pour notifier les applications tierces. La seule méthode de modification des variables d'environnement global sous Windows 95 consiste à modifier le fichier autoexec.bat et à redémarrer.

Énigme
la source
2
L'Explorateur Windows dans Windows 7 gère ce message, et il suffit de redémarrer l'invite de commandes à partir de la barre des tâches ou du menu Démarrer.
Alexey Ivanov
"Les modifications apportées aux variables d'environnement doivent prendre effet immédiatement, si vous effectuez la modification via la boîte de dialogue Propriétés principale de l'ordinateur en question (accédez à Poste de travail | Propriétés | Avancé | Variables d'environnement). Une fois les modifications enregistrées, Explorer diffuse un message WM_SETTINGCHANGE à toutes les fenêtres pour les informer du changement. " serverfault.com/questions/8855/…
mawcsco
2
"Astuce système Cet article s'applique à une version de Windows différente de celle que vous utilisez. Le contenu de cet article peut ne pas vous concerner. Visitez le Centre de solutions Windows 8"
mawcsco
Cela ne m'étonnerait pas qu'il s'agisse d'un détail d'implémentation et que Microsoft n'avait aucune intention de prendre en charge ce comportement dans Windows 8 ou supérieur.
surfasb
1

Le problème vient de vos paramètres utilisateur. Dans la fenêtre 8, chaque utilisateur a ses propres variables d'environnement.

Ouvrez les propriétés du système (Démarrer-> [tapez "Panneau de configuration"] -> Panneau de configuration \ Système et sécurité \ Système -> Paramètres système avancés -> Variables d'environnement)

L'approche ci-dessus modifiera les variables d'environnement pour l'utilisateur root, peut-être pas votre utilisateur actuel.

Vous devez aller dans le compte utilisateur -> sélectionner votre compte actuel -> changer les variables d'environnement

Après avoir changé, redémarrez Power Shell. ensuite

echo $env:JAVA_HOME

ou

Get-ChildItem env

J'espère que ceci vous aidera.

Vu Gia Truong
la source
Je pense que vous avez peut-être manqué le détail dans mes captures d'écran et vidéo qui montre la boîte de dialogue avec "Variables utilisateur pour mwillia3". C'est mon nom d'utilisateur. Je sais avec certitude que je modifiais les variables d'environnement correctes. L'application C # déclenche l'événement, avec l'ancienne valeur, pas la valeur mise à jour. J'ai abandonné. Je suis assez certain qu'il s'agit d'un bogue Win 8 et je n'ai plus accès à Windows 8 pour le tester.
mawcsco
Certaines personnes ne lisent pas toujours les détails. Je vois cela sur certains systèmes et pas sur d'autres, je l'ai même vu sur Windows 7/2008. Il n'y a pas de rime ni de raison pour laquelle il m'arrive de trouver.
ferventcoder
Même problème avec Windows Server 2012 r2 même après la propagation de WM_SETTINGSCHANGED. Je pense que c'est un bug Windows.
vezenkov
0

Essayez SETX à la place de SET. Par exempleSETX PATH "%PATH%;MyPath"

kct
la source
1
Pouvez-vous expliquer pourquoi SETX plutôt que de SETtravailler.
ChrisF
Tout d'abord, je n'utilisais pas la ligne de commande, j'utilisais la boîte de dialogue système. Deuxièmement, mon modèle de comportement fonctionne correctement dans Windows 7, mais parfois pas dans Windows 8. Pouvez-vous indiquer la documentation qui montre comment SET et SETX ont changé entre Windows 7 et Windows 8?
mawcsco
0

Si vous utilisez Windows 8.1, ouvrez l'invite de commande en tant qu'administrateur, puis appelez la commande PATH et vous devriez la voir y apparaître. Lorsque vous revenez à cmd normal, il apparaîtra également. Et en fait, vous devriez pouvoir démarrer l'application ajoutée à partir de l'invite de commande.

viktorkh
la source
-1

Cela fonctionne-t-il si vous utilisez Win + R à partir du bureau pour démarrer cmd.exe? Je suppose que le démarrage à partir de l'écran de démarrage entraîne une différence entre le parent de cmd.exe démarré et explorer.exe (WSAHost.exe, IIRC ou autre), et ce processus parent ne met pas à jour son environnement pendant les messages WM_SETTINGCHANGE. Je n'ai pas de machine Windows 8 sous la main pour tester ...

user348438
la source
Même dans Windows 8, l'interface utilisateur de l'écran de démarrage semble faire partie de explorer.exe car elle disparaît lorsque explorer.exe est tué.
binki