Si je modifie ou ajoute une variable d'environnement, je dois redémarrer l'invite de commande. Y a-t-il une commande que je pourrais exécuter qui ferait cela sans redémarrer CMD?
windows
cmd
environment-variables
Eric Schoonover
la source
la source
Réponses:
Vous pouvez capturer les variables d'environnement système avec un script vbs, mais vous avez besoin d'un script bat pour réellement changer les variables d'environnement actuelles, c'est donc une solution combinée.
Créez un fichier nommé
resetvars.vbs
contenant ce code et enregistrez-le sur le chemin:créez un autre nom de fichier resetvars.bat contenant ce code, même emplacement:
Lorsque vous souhaitez actualiser les variables d'environnement, exécutez simplement
resetvars.bat
Apologétique :
Les deux principaux problèmes que j'ai rencontrés avec cette solution étaient
une. Je n'ai pas pu trouver un moyen simple d'exporter des variables d'environnement d'un script vbs vers l'invite de commande, et
b. la variable d'environnement PATH est une concaténation de l'utilisateur et des variables système PATH.
Je ne sais pas quelle est la règle générale pour les variables en conflit entre l'utilisateur et le système, j'ai donc choisi de faire remplacer le système par l'utilisateur, sauf dans la variable PATH qui est gérée spécifiquement.
J'utilise le mécanisme étrange vbs + bat + bat temporaire pour contourner le problème de l'exportation de variables à partir de vbs.
Remarque : ce script ne supprime pas les variables.
Cela peut probablement être amélioré.
AJOUTÉE
Si vous devez exporter l'environnement d'une fenêtre cmd vers une autre, utilisez ce script (appelons-le
exportvars.vbs
):Exécuter
exportvars.vbs
dans la fenêtre que vous voulez exporter à partir , puis passer à la fenêtre que vous souhaitez exporter vers et tapez:la source
Voici ce que Chocolatey utilise.
https://github.com/chocolatey/choco/blob/master/src/chocolatey.resources/redirects/RefreshEnv.cmd
la source
RefreshEnv
pour obtenir des variables d'environnement mises à jour dans votre session actuelle.Powershell
aussi? Cela ne semble fonctionner quecmd.exe
pour moi.Sur Windows 7/8/10, vous pouvez installer Chocolatey, qui a un script pour ce intégré.
Après avoir installé Chocolatey, tapez simplement
refreshenv
.la source
De par sa conception, il n'existe pas de mécanisme intégré pour Windows pour propager une variable d'environnement ajouter / modifier / supprimer à un cmd.exe déjà en cours d'exécution, à partir d'un autre cmd.exe ou 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 commandes ouverte existante, vous devez soit redémarrer l'invite de commandes, soit ajouter manuellement à l'aide de SET dans l'invite de commandes existante.
La dernière réponse acceptée montre une solution de contournement partielle en actualisant manuellement toutes les variables d'environnement dans un script. Le script gère le cas d'utilisation de la modification globale des 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 propage pas vers un autre cmd.exe en cours d'exécution.
la source
Je suis tombé sur cette réponse avant de trouver finalement une solution plus simple.
Redémarrez simplement
explorer.exe
dans le Gestionnaire des tâches.Je n'ai pas testé, mais vous devrez peut-être également rouvrir votre invite de commande.
Remerciements à Timo Huovinen ici: Noeud non reconnu bien installé avec succès (si cela vous a aidé, veuillez donner le crédit du commentaire de cet homme).
la source
cmd
fenêtre en tant qu'administrateur. Utilisez la commandetaskkill /f /im explorer.exe && explorer.exe
. Cela tuera le processus explorer.exe et le redémarrera.Cela fonctionne sur Windows 7:
SET PATH=%PATH%;C:\CmdShortcuts
testé en tapant echo% PATH% et cela a fonctionné, très bien. également défini si vous ouvrez une nouvelle cmd, plus besoin de ces redémarrages embêtants :)
la source
setx
car il hérite de l'environnement actuel qui peut avoir des variables qui ont été modifiées et pas ce que je veux en permanence. Le faire de cette façon me permet d'éviter de redémarrer la console afin d'utiliser les variables, tout en évitant le problème de ne pas les avoir disponibles globalement à l'avenir.Utilisez "setx" et redémarrez l'invite cmd
Il existe un outil en ligne de commande nommé " setx " pour ce travail. C'est pour lire et écrire des variables env. Les variables persistent après la fermeture de la fenêtre de commande.
Il "crée ou modifie des variables d'environnement dans l'environnement utilisateur ou système, sans nécessiter de programmation ou de script. La commande setx récupère également les valeurs des clés de registre et les écrit dans des fichiers texte."
Remarque: les variables créées ou modifiées par cet outil seront disponibles dans les futures fenêtres de commandes mais pas dans la fenêtre de commandes CMD.exe actuelle. Vous devez donc redémarrer.
S'il
setx
manque:Ou modifiez le registre
MSDN dit:
la source
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\VARIABLE
utilisateur actuel:HKEY_CURRENT_USER\Environment\VARIABLE
%PATH%
alorssetx
peut tronquer cette 1024 octets! Et juste comme ça, sa soirée a disparuL'appel de cette fonction a fonctionné pour moi:
la source
La meilleure méthode que j'ai trouvée était de simplement faire une requête de registre. Voici mon exemple.
Dans mon exemple, j'ai effectué une installation à l'aide d'un fichier batch qui a ajouté de nouvelles variables d'environnement. J'avais besoin de faire des choses avec cela dès que l'installation était terminée, mais je n'ai pas pu générer un nouveau processus avec ces nouvelles variables. J'ai testé la création d'une autre fenêtre d'explorateur et j'ai rappelé cmd.exe et cela a fonctionné, mais sur Vista et Windows 7, Explorer ne fonctionne que comme une seule instance et normalement en tant que personne connectée. Cela échouerait avec l'automatisation car j'ai besoin de mes crédits d'administrateur faire des choses indépendamment de l'exécution à partir du système local ou en tant qu'administrateur sur la boîte. La limitation à cela est qu'il ne gère pas des choses comme le chemin, cela ne fonctionnait que sur des variables d'environnement simples. Cela m'a permis d'utiliser un lot pour accéder à un répertoire (avec des espaces) et copier dans des fichiers exécutés .exes et etc. Cela a été écrit aujourd'hui à partir des ressources de mai sur stackoverflow.com
Appels de lot d'origine vers un nouveau lot:
testenvget.cmd SDROOT (ou quelle que soit la variable)
Il y a aussi une autre méthode que j'ai imaginée à partir de différentes idées. Veuillez voir ci-dessous. Cela obtiendra essentiellement la variable de chemin la plus récente du registre.Cependant, cela entraînera un certain nombre de problèmes car la requête de registre va donner des variables en soi, ce qui signifie que partout où il y a une variable, cela ne fonctionnera pas, donc pour lutter contre ce problème, je essentiellement doubler le chemin. Très sale. La méthode la plus avantageuse serait de faire: Définir le chemin d'accès =% Chemin d'accès%; C: \ Program Files \ Software .... \
Quoi qu'il en soit, voici le nouveau fichier de commandes, veuillez faire preuve de prudence.
la source
La façon la plus simple d'ajouter une variable au chemin sans redémarrer pour la session en cours est d'ouvrir l'invite de commande et de taper:
et appuyez sur enter.
pour vérifier si votre variable est chargée, tapez
et appuyez sur enter. Cependant, la variable ne sera qu'une partie du chemin jusqu'au redémarrage.
la source
Il est possible de le faire en remplaçant la table d'environnement dans un processus spécifié lui-même.
Comme preuve de concept, j'ai écrit cet exemple d'application, qui vient de modifier une seule variable d'environnement (connue) dans un processus cmd.exe:
Exemple de sortie:
Remarques
Cette approche serait également limitée aux restrictions de sécurité. Si la cible est exécutée à une altitude plus élevée ou sur un compte supérieur (tel que SYSTEM), nous n'aurions pas la permission de modifier sa mémoire.
Si vous vouliez le faire pour une application 32 bits, les décalages codés en dur ci-dessus changeraient respectivement en 0x10 et 0x48. Ces décalages peuvent être trouvés en vidant les structures _PEB et _RTL_USER_PROCESS_PARAMETERS dans un débogueur (par exemple dans WinDbg
dt _PEB
etdt _RTL_USER_PROCESS_PARAMETERS
)Pour changer la preuve de concept en ce dont l'OP a besoin, il suffit d'énumérer les variables d'environnement système et utilisateur actuelles (telles que documentées par la réponse de @ tsadok) et d'écrire toute la table d'environnement dans la mémoire du processus cible.
Edit: La taille du bloc d'environnement est également stockée dans la structure _RTL_USER_PROCESS_PARAMETERS, mais la mémoire est allouée sur le tas du processus. Donc, à partir d'un processus externe, nous n'aurions pas la possibilité de le redimensionner et de l'agrandir. J'ai joué avec VirtualAllocEx pour allouer de la mémoire supplémentaire dans le processus cible pour le stockage de l'environnement, et j'ai pu définir et lire une table entièrement nouvelle. Malheureusement, toute tentative de modification de l'environnement à partir de moyens normaux se bloquera et brûlera car l'adresse ne pointe plus vers le tas (elle se bloquera dans RtlSizeHeap).
la source
Les variables d'environnement sont conservées dans HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet \ Control \ Session Manager \ Environment.
La plupart des variables env utiles, telles que Path, sont stockées en tant que REG_SZ. Il existe plusieurs façons d'accéder au registre, notamment REGEDIT:
REGEDIT /E <filename> "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment"
La sortie commence par des nombres magiques. Donc, pour le rechercher avec la commande find, il doit être tapé et redirigé:
type <filename> | findstr -c:\"Path\"
Donc, si vous souhaitez simplement actualiser la variable de chemin dans votre session de commande actuelle avec ce qui se trouve dans les propriétés système, le script de commandes suivant fonctionne correctement:
RefreshPath.cmd:
la source
Essayez d'ouvrir une nouvelle invite de commande en tant qu'administrateur. Cela a fonctionné pour moi sur Windows 10. (Je sais que c'est une ancienne réponse, mais j'ai dû la partager car avoir à écrire un script VBS juste pour cela est absurde).
la source
Le redémarrage de l'explorateur l'a fait pour moi, mais uniquement pour les nouveaux terminaux cmd.
Le terminal sur lequel j'ai défini le chemin pouvait déjà voir la nouvelle variable Path (dans Windows 7).
la source
La chose déroutante pourrait être qu'il existe quelques endroits pour démarrer la cmd. Dans mon cas, j'ai exécuté cmd à partir de l'explorateur Windows et les variables d' environnement n'ont pas changé tandis qu'au démarrage de cmd à partir de la «course» (touche Windows + r) les variables d' environnement ont été modifiées .
Dans mon cas, je venais de tuer le processus de l'explorateur Windows à partir du gestionnaire de tâches, puis de le redémarrer à nouveau à partir du gestionnaire de tâches .
Une fois que j'ai fait cela, j'ai eu accès à la nouvelle variable d'environnement à partir d'une cmd générée à partir de l'explorateur Windows.
la source
J'utilise le code suivant dans mes scripts batch:
En utilisant SET après SETX, il est possible d'utiliser directement la variable "locale" sans redémarrer la fenêtre de commande. Et lors de la prochaine exécution, la variable d'environnement sera utilisée.
la source
J'ai aimé l'approche suivie par le chocolat, comme indiqué dans la réponse lâche anonyme, car il s'agit d'une approche par lots pure. Cependant, il laisse un fichier temporaire et quelques variables temporaires qui traînent. Je me suis fait une version plus propre.
Créez un fichier
refreshEnv.bat
quelque part sur votrePATH
. Actualisez votre environnement de console en exécutantrefreshEnv
.la source
Si cela ne concerne qu'un (ou quelques) vars spécifiques que vous souhaitez modifier, je pense que le moyen le plus simple est une solution de contournement : il suffit de l'installer dans votre environnement ET dans votre session de console actuelle
J'ai ce simple script batch pour changer mon Maven de java7 à Java8 (qui sont à la fois env. Vars) Le lot dossier est dans mon PATH var donc je peux toujours appeler « J8 » et dans ma console et dans l'environnement mon JAVA_HOME var se change:
j8.bat:
Jusqu'à présent, je trouve que cela fonctionne mieux et plus facilement. Vous voulez probablement que cela soit dans une seule commande, mais ce n'est tout simplement pas là dans Windows ...
la source
La solution que j'utilise depuis quelques années maintenant:
Edit: Woops, voici la version mise à jour.
la source
Il n'y a pas de chemin droit, comme l'a dit Kev. Dans la plupart des cas, il est plus simple de générer une autre boîte CMD. Plus gênant, les programmes en cours d'exécution ne sont pas non plus au courant des changements (bien que l'IIRC puisse avoir un message diffusé à surveiller pour être notifié d'un tel changement).
Cela a été pire: dans les anciennes versions de Windows, vous deviez vous déconnecter puis vous reconnecter pour prendre en compte les changements ...
la source
J'utilise ce script Powershell pour ajouter à la variable PATH . Avec un petit ajustement, cela peut aussi fonctionner dans votre cas, je crois.
la source
Merci de poster cette question qui est assez intéressante, même en 2019 (en effet, il n'est pas facile de renouveler le shell cmd car il s'agit d'une seule instance comme mentionné ci-dessus), car le renouvellement des variables d'environnement dans windows permet d'accomplir de nombreuses tâches d'automatisation sans avoir à redémarrer manuellement la ligne de commande.
Par exemple, nous l'utilisons pour permettre le déploiement et la configuration de logiciels sur un grand nombre de machines que nous réinstallons régulièrement. Et je dois admettre que devoir redémarrer la ligne de commande lors du déploiement de notre logiciel serait très peu pratique et nous obligerait à trouver des solutions de contournement qui ne sont pas forcément agréables. Passons à notre problème. Nous procédons comme suit.
1 - Nous avons un script batch qui à son tour appelle un script PowerShell comme celui-ci
[fichier: task.cmd] .
cmd
> powershell.exe -executionpolicy unrestricted -File C:\path_here\refresh.ps1
2 - Après cela, le script refresh.ps1 renouvelle les variables d'environnement à l'aide de clés de registre (GetValueNames (), etc.). Ensuite, dans le même script powershell, il suffit d'appeler les nouvelles variables d'environnement disponibles. Par exemple, dans un cas typique, si nous venons d'installer nodeJS auparavant avec cmd en utilisant des commandes silencieuses, après avoir appelé la fonction, nous pouvons appeler directement npm pour installer, dans la même session, des packages particuliers comme suit.
[fichier: refresh.ps1]
Une fois le script powershell terminé, le script cmd continue avec d'autres tâches. Maintenant, une chose à garder à l'esprit est qu'après la fin de la tâche, cmd n'a toujours pas accès aux nouvelles variables d'environnement, même si le script powershell a mis à jour celles de sa propre session. C'est pourquoi nous faisons toutes les tâches nécessaires dans le script powershell qui peut appeler les mêmes commandes que cmd bien sûr.
la source
Modifier: cela ne fonctionne que si les changements d'environnement que vous effectuez résultent de l'exécution d'un fichier de commandes.
Si un fichier de commandes commence par,
SETLOCAL
il se détachera toujours vers votre environnement d'origine à la sortie même si vous oubliez d'appelerENDLOCAL
avant la fermeture du lot, ou s'il s'arrête de manière inattendue.Presque tous les fichiers batch que j'écris commencent par,
SETLOCAL
car dans la plupart des cas, je ne veux pas que les effets secondaires des changements d'environnement restent. Dans les cas où je souhaite que certaines modifications de variable d'environnement se propagent en dehors du fichier de commandes, ma dernièreENDLOCAL
ressemble à ceci:la source
Pour résoudre ce problème, j'ai modifié la variable d'environnement à l'aide des DEUX setx et set, puis redémarré toutes les instances de explorer.exe. De cette façon, tout processus démarré par la suite aura la nouvelle variable d'environnement.
Mon script batch pour ce faire:
Le problème avec cette approche est que toutes les fenêtres d'explorateur actuellement ouvertes seront fermées, ce qui est probablement une mauvaise idée - Mais consultez le post de Kev pour savoir pourquoi cela est nécessaire
la source