Windows tiene el setx
comando:
Description:
Creates or modifies environment variables in the user or system
environment.
Entonces puede establecer una variable como esta:
setx FOOBAR 1
Y puede borrar el valor de esta manera:
setx FOOBAR ""
Sin embargo, la variable no se elimina. Se queda en el registro:
Entonces, ¿cómo eliminarías realmente la variable?
windows
registry
environment-variables
Peter Mortensen
fuente
fuente
Respuestas:
Para eliminar la variable del entorno actual ( no de forma permanente):
Para eliminar permanentemente la variable del entorno del usuario (que es el lugar predeterminado, la
setx
coloca):Si la variable se configura en el entorno del sistema (por ejemplo, si la configuró originalmente
setx /M
), como administrador ejecute:Nota: Los
REG
comandos anteriores no afectarán ningún proceso existente (y algunos procesos nuevos que se bifurcan a partir de procesos existentes), por lo que si es importante que el cambio surta efecto de inmediato, lo más fácil y seguro es cerrar sesión y volver a iniciarla o reiniciar. Si esto no es una opción o si desea profundizar, algunas de las otras respuestas aquí tienen algunas sugerencias excelentes que pueden adaptarse a su caso de uso.fuente
setx JUNK Hello
. Abrir nuevo cmd. Escribeecho %JUNK%
y obténHello
. Luego lo hagoREG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V JUNK
y confirmo que el valor se ha ido del registro. Abro un nuevo cmd y escriboecho %JUNK%
y sigo obteniendoHello
. La búsqueda en el registro no muestra la presencia de 'JUNK'. ¡No me digas que necesitas reiniciar!user
comando de entorno, tiene éxito. Luego, cuando vuelvo a escribir el comando que reciboThe system was unable to find the specified registry or key value
. Además, una búsqueda globalJUNK
en el registro conregedit
nada resulta. Aún así, cuando abro una nueva ventana de Comando (a través de Inicio / accesorios, o cmd.exe en Ejecutar) y escriboecho %JUNK%
, ¡el valor sigue ahí!SET
lista para el próximo shell de cmd) y luego eliminarlo del registro, por ejemplo:SETX FOOBAR "" & REG delete HKCU\Environment /F /V FOOBAR
Para eliminar la variable de la sesión de comando actual sin eliminarla permanentemente, use el
set
comando incorporado regular , simplemente no ponga nada después del signo igual:set FOOBAR=
Para confirmar, ejecute
set
sin argumentos y verifique el entorno actual. La variable debería faltar por completo de la lista.fuente
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:
Eliminar persistente
Hay dos conjuntos de variables de entorno, todo el sistema y usuario.
Eliminar la variable de entorno del usuario:
Eliminar la variable de entorno de todo el sistema:
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 :
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.
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.
fuente
source .bashrc
(o sus primos) en Windows. Esto va a la parte superior de la línea "referir a esto" para mí.Desde PowerShell puede usar el
[System.Environment]::SetEnvironmentVariable()
método .NET :Para eliminar una variable de entorno de usuario llamada
FOO
:Tenga en cuenta que
$null
se utiliza para indicar mejor la intención de eliminar la variable, aunque técnicamente es efectivamente lo mismo que pasar''
en este caso.Para eliminar una variable de entorno del sistema (nivel de máquina) denominada
FOO
: requiere elevación (debe ejecutarse como administrador):Además de una ejecución más rápida, la ventaja sobre el
reg.exe
método basado es que otras aplicaciones son notificadas del cambio , a través de unWM_SETTINGCHANGE
mensaje (aunque no todas las aplicaciones escuchan ese mensaje).fuente
Estoy de acuerdo con CupawnTae .
SET
no es útil para cambios en el entorno maestro.FYI: las variables del sistema están en
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
(mucho más tiempo que los usuarios var)El comando completo para un sistema var llamado FOOBAR es:
(Tenga en cuenta las citas necesarias para manejar el espacio).
Es una lástima que el
setx
comando no sea compatible con una sintaxis de eliminación. :(PD: Úselo responsablemente: si mata su variable de ruta, ¡no me culpe!
fuente
El comando en la respuesta de DougWare no funcionó, pero sí:
El atajo
HKLM
se puede usar paraHKEY_LOCAL_MACHINE
.fuente
Eliminar sin reiniciar
De hecho, la pregunta del OP se ha respondido ampliamente, incluido cómo evitar reiniciar a través de powershell, vbscript o lo que sea.
Sin embargo, si necesita apegarse solo a los comandos cmd y no puede darse el lujo de poder llamar a powershell o vbscript, puede usar el siguiente enfoque:
Entonces, la magia aquí es que al usar "setx" para asignar algo a una variable que no necesita (en mi ejemplo DUMMY), obliga a Explorer.exe a releer las variables del registro, sin necesidad de PowerShell. Luego limpia ese maniquí, y aunque ese permanecerá en el entorno de Explorer por un tiempo más, probablemente no dañará a nadie.
O si después de eliminar variables necesita establecer otras nuevas, entonces ni siquiera necesita ningún ficticio. Simplemente usando SETX para establecer las nuevas variables borrará automáticamente las que acaba de eliminar de cualquier nueva tarea de cmd que pueda comenzar.
Información general: acabo de utilizar este enfoque con éxito para reemplazar un conjunto de variables de usuario por variables del sistema con el mismo nombre en todas las computadoras en mi trabajo, modificando un script de cmd existente. Hay demasiadas computadoras para hacerlo manualmente, y tampoco era práctico copiar powershell o vbscripts adicionales en todas ellas. La razón por la que necesitaba reemplazar urgentemente al usuario con variables del sistema era que las variables del usuario se sincronizaban en los perfiles móviles (no pensé en eso), por lo que varias máquinas que usaban el mismo inicio de sesión de Windows pero necesitaban valores diferentes, se confundieron.
fuente
solo hace que el valor de FOOBAR sea una cadena nula. (Aunque, se muestra con el
set
comando con el "", entonces quizás las comillas dobles son la cadena).Solía:
y luego FOOBAR ya no figuraba en el comando set. (No fue necesario cerrar sesión).
Windows 7 de 32 bits, utilizando el símbolo del sistema, no administrador es lo que utilicé. (No cmd o Windows+ R, que podría ser diferente).
Por cierto, no vi la variable que creé en ninguna parte del registro después de haberla creado. Estoy usando RegEdit no como administrador.
fuente
También puede crear un pequeño script VBScript :
Entonces llámalo como
%windir%\System32\cscript.exe //Nologo "script_name.vbs" FOOBAR
.La desventaja es que necesita un script adicional, pero no requiere un reinicio.
fuente