Establecer una variable de entorno persistente desde cmd.exe

Tengo que establecer variables de entorno en diferentes máquinas de Windows, pero no quiero que me moleste cambiarlas manualmente al acceder a la pantalla de propiedades de “Mi PC”

Quiero hacerlo desde la línea de comando, con un archivo por lotes. Por lo que yo entiendo, usar set solo cambiará la variable para los procesos que llamaré en la ventana de comandos.

Quiero configurarlo definitivamente, por lo que más adelante, cuando ejecute un nuevo proceso, utilizará las nuevas configuraciones que he establecido. ¿Hay alguna manera de hacerlo desde la línea de comando?

La documentación de MSDN para variables de entorno le dice qué hacer:

Para agregar o modificar mediante progtwigción las variables de entorno del sistema, agréguelos a la clave de registro HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environment y luego transmita un mensaje WM_SETTINGCHANGE con lParam establecido en la cadena “Entorno”. Esto permite que las aplicaciones, como el shell, recojan sus actualizaciones.

Por supuesto, necesitará derechos de administrador para hacer esto. No conozco ninguna forma de transmitir un mensaje de Windows desde el lote de Windows, por lo que tendrá que escribir un pequeño progtwig para hacerlo.

Utilice el comando SETX (tenga en cuenta el sufijo ‘x’) para establecer las variables que persisten después de que se haya cerrado la ventana de cmd.

Aunque vale la pena leer las ‘notas’ que se muestran si imprime el uso ( setx /? ), En particular:

2) En un sistema local, las variables creadas o modificadas por esta herramienta estarán disponibles en futuras ventanas de comandos, pero no en la ventana actual de comandos de CMD.exe.

3) En un sistema remoto, las variables creadas o modificadas por esta herramienta estarán disponibles en la siguiente sesión de inicio de sesión.

En PowerShell, el 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