Définir une variable d'environnement persistante à partir de cmd.exe

123

Je dois définir des variables d'environnement sur différentes machines Windows, mais je ne veux pas être dérangé de les changer manuellement en accédant à l'écran des propriétés de "Poste de travail"

Je veux le faire à partir de la ligne de commande, avec un fichier batch. Pour autant que je sache, l'utilisation de set ne changera que la variable des processus que j'appellerai dans la fenêtre de commande.

Je veux le définir définitivement, donc plus tard, lors de l'exécution d'un nouveau processus, il utilisera les nouveaux paramètres que j'ai définis. Existe-t-il un moyen de le faire à partir de la ligne de commande?

Arthur
la source
Quel est l'intérêt de les définir à partir de la ligne de commande s'ils deviennent permanents? Vous n'aurez plus besoin de le refaire.
d-live
12
Oui, mais je dois le faire sur plusieurs ordinateurs, donc exécuter le script me fera gagner du temps.
Arthur
2
Ok, dans ce cas, vous pouvez configurer votre env sur un ordinateur et faire une exportation des entrées décrites ci-dessous et avoir un fichier .reg, si SETX n'est pas disponible pour vous.
d-live
C'est ce que j'ai fait. Merci.
Arthur
1
RE: «Quel est le point de les définir à partir de la ligne de commande ...» Là où je travaille, il y a une exigence constante d'un certain nombre de variables environnementales persistantes à différentes valeurs afin de tester / développer différentes versions du logiciel. La licence signifie que cela ne peut être fait d'aucune autre manière (par exemple, exécuter une VM), donc notre seul recours est d'utiliser SETX dans un script batch. Utiliser .reg est moins bon car il est plus difficile de documenter / voir exactement ce qui se passe
Tony Eastwood

Réponses:

189

Utilisez la commande SETX (notez le suffixe «x») pour définir les variables qui persistent après la fermeture de la fenêtre cmd.

Par exemple, pour définir une var d'environnement "foo" avec la valeur "bar":

setx foo bar

Bien que cela vaut la peine de lire les `` notes '' qui s'affichent si vous imprimez l'utilisation ( setx /?), en particulier:

2) Sur un système local, les variables créées ou modifiées par cet outil seront disponibles dans les futures fenêtres de commande mais pas dans la fenêtre de commande CMD.exe actuelle.

3) Sur un système distant, les variables créées ou modifiées par cet outil seront disponibles à la prochaine session de connexion.

Dans PowerShell, la commande [Environment] :: SetEnvironmentVariable .

Vik David
la source
Il semble que SETX n'est disponible que sur Windows XP SP2
Arthur
2
Cela a fonctionné sur Windows 7 pour moi. Quelle version de Windows utilisez-vous?
Vik David
@jules: Vous pouvez l'obtenir à partir du Kit de ressources, alors.
Joey
46
Attention avec SETX, cela tronque la longueur de votre variable à 1024 caractères ... très dangereux lors de la manipulation de% path%.
Etienne Desgagné
2
avec Power Shell, vous pouvez simplement [Environment]::SetEnvironmentVariable('PATH', "Whatever you need it to be", "Machine"), voir msdn.microsoft.com/en-us/library/96xafkes(v=vs.110).aspx
Gradient
21

La documentation MSDN pour les variables d'environnement vous indique ce qu'il faut faire:

Pour ajouter ou modifier par programme des variables d'environnement système, ajoutez-les à la clé de registre HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environment , puis diffusez un message WM_SETTINGCHANGE avec lParam défini sur la chaîne «Environnement». Cela permet aux applications, telles que le shell, de récupérer vos mises à jour.

Vous aurez bien sûr besoin des droits d'administrateur pour ce faire. Je ne connais aucun moyen de diffuser un message Windows à partir d'un lot Windows, vous devrez donc écrire un petit programme pour ce faire.

David Heffernan
la source
1
Ok, donc compte tenu de votre solution, j'ai créé un fichier de registre (.reg) contenant les variables d'environnement que je souhaite ajouter / modifier. Je vais ensuite exécuter ce fichier sur tous les PC cibles. Je n'ai pas vraiment besoin d'envoyer un message Windows, car je vais simplement redémarrer l'application qui sera affectée. Merci.
Arthur
1
J'ajoute votre autre réponse ici, car c'était exactement ce que je cherchais quand je suis tombé sur cette question: stackoverflow.com/a/19705691/3543437
kayleeFrye_onDeck
1
@David, alors pourquoi pas setxpar ci-dessous?
Pacerier
Je pense que ce reg a l'avantage de ne pas tronquer et de ne pas être
PowerShell
2
' SetVar.vbs
Sub sety(wsh, action, typey, vary, value)
  Dim wu
  Set wu = wsh.Environment(typey)
  wui = wu.Item(vary)
  Select Case action
    Case "ls"
      WScript.Echo wui
    Case "del"
      On Error Resume Next
      wu.remove(vary)
      On Error Goto 0
    Case "set"
      wu.Item(vary) = value
    Case "add"
      If wui = "" Then
        wu.Item(vary) = value
      ElseIf InStr(UCase(";" & wui & ";"), UCase(";" & value & ";")) = 0 Then
        wu.Item(vary) = value & ";" & wui
      End If
    Case Else
      WScript.Echo "Bad action"
  End Select
End Sub

Dim wsh, args
Set wsh = WScript.CreateObject("WScript.Shell")
Set args = WScript.Arguments
Select Case WScript.Arguments.Length
  Case 3
    value = ""
  Case 4
    value = args(3)
  Case Else
    WScript.Echo "Arguments - 0: ls,del,set,add; 1: user,system, 2: variable; 3: value"
    value = "```"
End Select
If Not value = "```" Then
  ' 0: ls,del,set,add; 1: user,system, 2: variable; 3: value
  sety wsh, args(0), args(1), UCase(args(2)), value
End If
Justin Peal
la source
21
Vous devriez envisager d'ajouter un contexte ou une explication pour accompagner votre code.
adamdunson
1
Puissant morceau de code +1. Fonctionne sur XP sans setx(et sans possibilité de l'installer). Utilisation simple (dans mon cas):wsh.Environment("user").Item("myVar") = "my value"
Marek
2
Puisque personne n'a pris la peine, à utiliser sur XP (aucun kit de ressources ou setx requis), pour accomplir {set foo = bar} pour toutes les (autres) fenêtres DOS: 1. enregistrez le code ci-dessus sous SetVar.vbs 2. setvar. vbs set system foo "bar" Remarque, la fenêtre DOS actuelle n'obtient pas FOO de cela. Problème défini foo = bar pour y parvenir
MicrosoftShouldBeKickedInNuts
2
Notez également, cela survit au redémarrage (lorsque vous utilisez le parm système)
MicrosoftShouldBeKickedInNuts
1

En effet, SET TEST_VARIABLE = value fonctionne uniquement pour le processus en cours, il SETXest donc obligatoire. Un exemple rapide de stockage permanent d'une variable d'environnement au niveau de l'utilisateur.

  1. Dans cmd, SETX TEST_VARIABLE etc. Pas encore appliqué ( echo %TEST_VARIABLE%montre %TEST_VARIABLE%,
  2. Vérification rapide: ouvrez cmd, echo %TEST_VARIABLE%affiche etc.
  3. Contrôle GUI: Propriétés système -> Avancé -> Variables d'environnement -> Variables utilisateur pour -> vous devriez voir Varible TEST_VARIABLE avec valeur etc.
Alexei
la source
0
:: Sets environment variables for both the current `cmd` window 
::   and/or other applications going forward.
:: I call this file keyz.cmd to be able to just type `keyz` at the prompt 
::   after changes because the word `keys` is already taken in Windows.

@echo off

:: set for the current window
set APCA_API_KEY_ID=key_id
set APCA_API_SECRET_KEY=secret_key
set APCA_API_BASE_URL=https://paper-api.alpaca.markets

:: setx also for other windows and processes going forward
setx APCA_API_KEY_ID     %APCA_API_KEY_ID%
setx APCA_API_SECRET_KEY %APCA_API_SECRET_KEY%
setx APCA_API_BASE_URL   %APCA_API_BASE_URL%

:: Displaying what was just set.
set apca

:: Or for copy/paste manually ...
:: setx APCA_API_KEY_ID     'key_id'
:: setx APCA_API_SECRET_KEY 'secret_key'
:: setx APCA_API_BASE_URL   'https://paper-api.alpaca.markets'
gseattle
la source