Esto se ha cubierto bastante, pero falta información crucial. Con suerte, puedo ayudar a aclarar cómo funciona esto y dar un poco de alivio a los viajeros cansados. :-)
Eliminar del proceso actual
Obviamente, todos saben que usted hace esto para eliminar una variable de entorno de su proceso actual:
set FOO=
Eliminar persistente
Hay dos conjuntos de variables de entorno, todo el sistema y usuario.
Eliminar la variable de entorno del usuario:
reg delete "HKCU\Environment" /v FOO /f
Eliminar la variable de entorno de todo el sistema:
REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOO
Aplicar valor sin reiniciar
¡Aquí está la información mágica que falta! Se pregunta por qué después de hacer esto, cuando inicia una nueva ventana de comandos, la variable de entorno sigue ahí. La razón es porque explorer.exe no ha actualizado su entorno. Cuando un proceso inicia otro, el nuevo proceso hereda el entorno del proceso que lo lanzó.
Hay dos formas de solucionar esto sin reiniciar. La forma más brutal es matar el proceso de explorer.exe y comenzarlo de nuevo. Puede hacerlo desde el Administrador de tareas . Sin embargo, no recomiendo este método.
La otra forma es decirle a explorer.exe que el entorno ha cambiado y que debería releerlo. Esto se hace transmitiendo un mensaje de Windows (WM_SETTINGCHANGE). Esto se puede lograr con un simple script de PowerShell. Podrías escribir fácilmente uno para hacer esto, pero encontré uno en la Configuración de la ventana de actualización después de los cambios en el script :
if (-not ("win32.nativemethods" -as [type])) {
add-type -Namespace Win32 -Name NativeMethods -MemberDefinition @"
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr SendMessageTimeout(
IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam,
uint fuFlags, uint uTimeout, out UIntPtr lpdwResult);
"@
}
$HWND_BROADCAST = [intptr]0xffff;
$WM_SETTINGCHANGE = 0x1a;
$result = [uintptr]::zero
[win32.nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE,[uintptr]::Zero, "Environment", 2, 5000, [ref]$result);
Resumen
Por lo tanto, para eliminar una variable de entorno de usuario llamada "FOO" y hacer que el cambio se refleje en los procesos que inicie después, haga lo siguiente.
- Guarde el script de PowerShell en un archivo (lo llamaremos updateenv.ps1).
- Haga esto desde la línea de comando: reg delete "HKCU \ Environment" / v FOO / f
- Ejecute updateenv.ps1.
- Cierre y vuelva a abrir su símbolo del sistema, y verá que la variable de entorno ya no está definida.
Tenga en cuenta que probablemente tendrá que actualizar su configuración de PowerShell para permitirle ejecutar este script, pero lo dejaré como un ejercicio de Google-fu para usted.