web-dev-qa-db-fra.com

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

Je dois définir des variables d'environnement sur différentes machines Windows, mais je ne veux pas être dérangé de les modifier 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 de commandes. Autant que je sache, utiliser 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. Est-il possible de le faire à partir de la ligne de commande?

104
Arthur

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

Bien que cela vaille la peine de lire les "notes" affichées 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.

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

160
Vik David

Le documentation MSDN pour les variables d'environnement vous indique quoi 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 une WM_SETTINGCHCH message avec lParam défini sur la chaîne "Environment". Cela permet aux applications, telles que Shell, de récupérer vos mises à jour.

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

18
David Heffernan
' 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
2
Justin Peal
:: 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'
0
gseattle

En effet, SET TEST_VARIABLE = valeur ne fonctionne que pour le processus en cours, donc SETX est requis. Un exemple rapide pour stocker de manière permanente une variable d’environnement au niveau utilisateur.

  1. En cmd, SETX TEST_VARIABLE etc. Pas encore appliqué (echo %TEST_VARIABLE% montre %TEST_VARIABLE%,
  2. Vérification rapide: open cmd, echo %TEST_VARIABLE% montre etc.
  3. Vérification de l'interface graphique: Propriétés système -> Avancé -> Variables d'environnement -> Variables utilisateur pour -> vous devriez voir Varible TEST_VARIABLE avec la valeur etc.
0
Alexei