windows - script - Establecer una variable de entorno persistente desde cmd.exe
variable batch script (3)
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 programació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 programa 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