585 votes

Existe-t-il une commande permettant de rafraîchir les variables d'environnement à partir de l'invite de commande sous Windows ?

Si je modifie ou ajoute une variable d'environnement, je dois relancer l'invite de commande (inconvénient mineur). Existe-t-il une commande que je pourrais exécuter qui ferait cela sans redémarrer CMD ?

47 votes

En fait, chaque programme qui a besoin de les voir doit être redémarré. L'environnement est copié dans la mémoire du processus au démarrage et n'a donc plus aucun lien avec les envvars définies par le système.

20 votes

Après les avoir lues, j'ai réalisé que il n'y a pas de cuillère ;) dans le monde réel, il suffit de redémarrer cmd.

0 votes

Ce n'est pas une commande, donc pas tout à fait une réponse, mais il y a un support pour cela en utilisant l'API Win32 si je lis correctement ce qui suit : support.microsoft.com/fr/us/help/104011/ Il devrait être capable de compiler cette ligne dans un simple programme C et de l'exécuter en suivant les mises à jour des variables d'environnement.

149voto

itsadok Points 12971

Vous pouvez capturer les variables d'environnement du système avec un vbs script, mais vous avez besoin d'un bat script pour modifier réellement les variables d'environnement actuelles, c'est donc une solution combinée.

Créez un fichier nommé resetvars.vbs contenant ce code, et le sauvegarder sur le chemin :

Set oShell = WScript.CreateObject("WScript.Shell")
filename = oShell.ExpandEnvironmentStrings("%TEMP%\resetvars.bat")
Set objFileSystem = CreateObject("Scripting.fileSystemObject")
Set oFile = objFileSystem.CreateTextFile(filename, TRUE)

set oEnv=oShell.Environment("System")
for each sitem in oEnv 
    oFile.WriteLine("SET " & sitem)
next
path = oEnv("PATH")

set oEnv=oShell.Environment("User")
for each sitem in oEnv 
    oFile.WriteLine("SET " & sitem)
next

path = path & ";" & oEnv("PATH")
oFile.WriteLine("SET PATH=" & path)
oFile.Close

créer un autre fichier nommé resetvars.bat contenant ce code, même emplacement :

resetvars.vbs
call "%TEMP%\resetvars.bat"

Lorsque vous souhaitez rafraîchir les variables d'environnement, il suffit d'exécuter resetvars.bat.


Apologétique :

Les deux principaux problèmes que j'ai rencontrés en élaborant cette solution sont les suivants : a. je n'ai pas trouvé de moyen direct d'exporter les variables d'environnement d'un script vbs script vers l'invite de commande, et b. la variable d'environnement PATH est une concaténation des variables PATH de l'utilisateur et du système.

Je ne suis pas sûr de la règle générale concernant les conflits de variables entre l'utilisateur et le système, j'ai donc choisi de faire en sorte que l'utilisateur prévale sur le système, sauf pour la variable PATH qui est gérée spécifiquement.

J'utilise le mécanisme bizarre vbs+bat+bat temporaire pour contourner le problème de l'exportation des variables depuis vbs.

Note : ce script ne supprime pas les variables.

Cela peut probablement être amélioré.

ADDED

Si vous devez exporter l'environnement d'une fenêtre cmd à une autre, utilisez ce script (appelons-le exportvars.vbs ) :

Set oShell = WScript.CreateObject("WScript.Shell")
filename = oShell.ExpandEnvironmentStrings("%TEMP%\resetvars.bat")
Set objFileSystem = CreateObject("Scripting.fileSystemObject")
Set oFile = objFileSystem.CreateTextFile(filename, TRUE)

set oEnv=oShell.Environment("Process")
for each sitem in oEnv 
    oFile.WriteLine("SET " & sitem)
next
oFile.Close

Exécuter exportvars.vbs dans la fenêtre que vous voulez exporter de puis passez à la fenêtre que vous voulez exporter. à et le type :

"%TEMP%\resetvars.bat"

2 votes

Vous pouvez peut-être éviter le fichier temporaire en utilisant la construction FOR /F "tokens=1,*" %%c IN ('resetvars.vbs') DO.

2 votes

Comme je l'ai dit dans ma réponse, "ou, ajouter manuellement en utilisant SET dans l'invite de commande existante", ce qui est ce que fait effectivement cette solution. Bonne réponse cependant.

3 votes

@itsadok - étant donné que c'est maintenant la réponse acceptée, vous devriez ajouter une brève explication au début pour mettre le script dans le contexte. c.-à-d. indiquer qu'il n'est pas possible de propager un changement de var env à un cmd.exe ouvert sans mettre à jour manuellement comme ci-dessus ou en redémarrant cmd.exe.

66voto

Kev Points 60744

Par conception, il n'y a pas de intégré mécanisme permettant à Windows de propager l'ajout/la modification/la suppression d'une variable d'environnement à un cmd.exe déjà en cours d'exécution, soit à partir d'un autre cmd.exe, soit à partir de "Poste de travail -> Propriétés ->Paramètres avancés -> Variables d'environnement".

Si vous modifiez ou ajoutez une nouvelle variable d'environnement en dehors de la portée d'une invite de commande ouverte existante, vous devez soit redémarrer l'invite de commande, soit l'ajouter manuellement en utilisant SET dans l'invite de commande existante.

Le site dernière réponse acceptée montre une solution partielle de contournement en rafraîchissant manuellement tous les variables d'environnement dans un script. Le script gère le cas d'utilisation consistant à modifier globalement les variables d'environnement dans "Poste de travail...Variables d'environnement", mais si une variable d'environnement est modifiée dans un cmd.exe, le script ne la propagera pas à un autre cmd.exe en cours d'exécution.

0 votes

Si quelqu'un a une solution fonctionnelle à ce problème, je vérifierai périodiquement et je pourrai modifier la réponse acceptée.

1 votes

Cela ne devrait pas être la réponse acceptée simplement parce qu'elle ne répond pas à la question posée. Cette question devrait rester sans réponse acceptée jusqu'à ce qu'une réponse soit trouvée.

4 votes

Et bizarrement, les instances supplémentaires de cmd.exe ne comptent pas. Ils tous doivent être tués avant que le changement soit reflété dans les nouveaux cmd.exe.

45voto

slccsoccer28 Points 144

Je suis tombé sur cette réponse avant de trouver finalement une solution plus simple.

Il suffit de redémarrer explorer.exe dans le gestionnaire des tâches.

Je n'ai pas testé, mais vous pouvez aussi avoir besoin de rouvrir votre invite de commande.

Crédit à Timo Huovinen ici : Nœud non reconnu bien qu'installé avec succès (si cela vous a aidé, allez donner crédit au commentaire de cet homme).

0 votes

Je suis arrivé ici parce que j'essayais d'ajouter un outil externe à Visual Studio pour pouvoir ouvrir une invite de commande à la racine de ma solution, comme décrit dans ce blog : neverindoubtnet.blogspot.com/2012/10/ ... et j'ai eu des problèmes similaires ... J'essayais de faire apparaître "git" dans ma variable path. J'ai ajouté les répertoires git à la variable PATH mais ils n'apparaissaient pas dans l'invite de commande que j'ouvrais depuis Visual Studio. La solution simple consistait à redémarrer Visual Studio. Les nouveaux ajouts à la variable PATH étaient alors visibles dans cmd.

4 votes

Cette solution m'aide sous Windows 10

14 votes

La question était : "Y a-t-il une commande que je pourrais exécuter qui ferait ceci sans redémarrer CMD ?"

29voto

Cela fonctionne sous Windows 7 : SET PATH=%PATH%;C:\CmdShortcuts

j'ai testé en tapant echo %PATH% et cela a fonctionné, très bien. aussi, si vous ouvrez un nouveau cmd, vous n'avez plus besoin de ces redémarrages fastidieux :)

1 votes

Ne fonctionne pas pour "new cmd" pour moi (Win7 x64). Voir écranvidéo

31 votes

Cela ne résout pas la question posée, et ne devrait pas le faire. La question originale est de savoir comment rafraîchir une variable d'environnement à une valeur qui a été définie en dehors de ce terminal.

0 votes

Bien que cela ne réponde pas à la question, cela fournit la moitié de la meilleure solution de travail. J'utilise ceci - pour la variable que je dois définir - puis j'ouvre le panneau de configuration et j'ajoute la variable d'environnement de manière globale. Je n'aime pas utiliser setx parce qu'il hérite de l'environnement actuel qui peut avoir des variables qui ont été modifiées et qui ne sont pas ce que je veux en permanence. En procédant ainsi, j'évite de redémarrer la console pour utiliser les variables, tout en évitant le problème de ne pas les avoir disponibles globalement à l'avenir.

24voto

Jens-André Koch Points 3506

"Si je modifie ou ajoute une variable d'environnement, je dois redémarrer l'invite de commande (inconvénient mineur)." Non, vous n'avez pas à redémarrer l'invite de commande. Arrêtez de vous amuser avec des solutions VBS ou Batch à moitié cuites.

Il existe un outil en ligne de commande appelé " setx " pour ce travail. C'est pour la lecture et l'écriture les variables d'environnement.

Il "crée ou modifie des variables d'environnement dans l'environnement de l'utilisateur ou du système, sans nécessiter de programmation ou de script. Le site setx La commande récupère également les valeurs des clés de registre et les écrit dans des fichiers texte."

1 votes

Pourriez-vous nous expliquer comment utiliser setx pour lire une variable d'environnement ? J'ai parcouru les différentes documentations et je ne le vois pas :-/.

2 votes

Setx VARIABLE -k "HKEY_LOCAL_MACHINE \Software\Microsoft\WindowsNT\CurrentVers ion \CurrentVersion " echo %VARIABLE

3 votes

L'environnement actuel du système : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\VARIABLE l'environnement actuel de l'utilisateur : HKEY_CURRENT_USER\Environment\VARIABLE

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X