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?
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 .
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.
' 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
:: 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'
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.
SETX TEST_VARIABLE etc
. Pas encore appliqué (echo %TEST_VARIABLE%
montre %TEST_VARIABLE%
,echo %TEST_VARIABLE%
montre etc
.etc
.