Impostare una variabile di ambiente persistente da cmd.exe

Devo impostare le variabili di ambiente su diverse macchine Windows, ma non voglio essere disturbato cambiandole manualmente accedendo alla schermata delle proprietà di “Risorse del computer”

Voglio farlo dalla riga di comando, con un file batch. Per quanto ho capito, l’utilizzo di set cambierà solo la variabile per i processi che chiamerò nella finestra di comando.

Voglio definirlo definitivamente, quindi più tardi, quando eseguirò un nuovo processo, userà le nuove impostazioni che ho impostato. C’è un modo per farlo dalla riga di comando?

La documentazione MSDN per le variabili di ambiente ti dice cosa fare:

Per aggiungere o modificare a livello di programmazione le variabili di ambiente del sistema, aggiungerle alla chiave di registro HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environment , quindi trasmettere un messaggio WM_SETTINGCHANGE con lParam impostato sulla stringa “Ambiente”. Ciò consente alle applicazioni, come la shell, di raccogliere gli aggiornamenti.

Ovviamente avrai bisogno dei diritti di amministratore per farlo. Non conosco alcun modo per trasmettere un messaggio di Windows dal batch di Windows, quindi è necessario scrivere un piccolo programma per farlo.

Usa il comando SETX (nota il suffisso ‘x’) per impostare le variabili che persistono dopo che la finestra di cmd è stata chiusa.

Anche se vale la pena leggere le ‘note’ che vengono visualizzate se si stampa l’utilizzo ( setx /? ), In particolare:

2) Su un sistema locale, le variabili create o modificate da questo strumento saranno disponibili nelle windows di comando future ma non nella finestra di comando CMD.exe corrente.

3) Su un sistema remoto, le variabili create o modificate da questo strumento saranno disponibili alla successiva sessione di accesso.

In PowerShell, il comando [Environment] :: SetEnvironmentVariable .

 ' 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