Si modifico o agrego una variable de entorno, tengo que reiniciar el símbolo del sistema. ¿Hay algún comando que pueda ejecutar que haga esto sin reiniciar CMD?
windows
cmd
environment-variables
Eric Schoonover
fuente
fuente
Respuestas:
Puede capturar las variables de entorno del sistema con un script vbs, pero necesita un script bat para cambiar realmente las variables de entorno actuales, por lo que esta es una solución combinada.
Cree un archivo llamado que
resetvars.vbs
contenga este código y guárdelo en la ruta:cree otro nombre de archivo resetvars.bat que contenga este código, la misma ubicación:
Cuando desee actualizar las variables de entorno, simplemente ejecute
resetvars.bat
Apologética :
Los dos problemas principales que tuve con esta solución fueron
a. No pude encontrar una manera sencilla de exportar variables de entorno de un script vbs de nuevo al símbolo del sistema, y
si. La variable de entorno PATH es una concatenación del usuario y las variables PATH del sistema.
No estoy seguro de cuál es la regla general para las variables en conflicto entre el usuario y el sistema, por lo que elegí hacer que el sistema de anulación del usuario, excepto en la variable PATH que se maneja específicamente.
Utilizo el extraño mecanismo vbs + bat + temporal bat para solucionar el problema de exportar variables desde vbs.
Nota : este script no elimina variables.
Esto probablemente se puede mejorar.
ADICIONAL
Si necesita exportar el entorno de una ventana de cmd a otra, use este script (llamémoslo
exportvars.vbs
):Ejecutar
exportvars.vbs
en la ventana que desea exportar desde , luego cambiar a la ventana que desea exportar a , y el tipo:fuente
Esto es lo que usa Chocolatey.
https://github.com/chocolatey/choco/blob/master/src/chocolatey.resources/redirects/RefreshEnv.cmd
fuente
RefreshEnv
para obtener variables de entorno actualizadas en su sesión actual.Powershell
también? Solo parece funcionarcmd.exe
para mí.En Windows 7/8/10, puede instalar Chocolatey, que tiene un script para este incorporado.
Después de instalar Chocolatey, simplemente escriba
refreshenv
.fuente
Por diseño no hay un construido en mecanismo para que Windows propague una variable de entorno agregar / cambiar / eliminar a un cmd.exe que ya se está ejecutando, ya sea desde otro cmd.exe o desde "Mi PC -> Propiedades -> Configuración avanzada -> Variables de entorno".
Si modifica o agrega una nueva variable de entorno fuera del alcance de un símbolo del sistema abierto existente, debe reiniciar el símbolo del sistema o agregar manualmente usando SET en el símbolo del sistema existente.
La última respuesta aceptada muestra una solución parcial al actualizar manualmente todas las variables de entorno en un script. El script maneja el caso de uso de cambiar las variables de entorno globalmente en "Mi PC ... Variables de entorno", pero si se cambia una variable de entorno en un cmd.exe, el script no se propagará a otro cmd.exe en ejecución.
fuente
Encontré esta respuesta antes de encontrar una solución más fácil.
Simplemente reinicie
explorer.exe
en el Administrador de tareas.No probé, pero es posible que también deba volver a abrir el símbolo del sistema.
Crédito a Timo Huovinen aquí: Nodo no reconocido aunque instalado correctamente (si esto le ayudó, por favor, den crédito de comentario de este hombre).
fuente
cmd
ventana como Administrador. Usa el comandotaskkill /f /im explorer.exe && explorer.exe
. Esto matará el proceso explorer.exe y lo reiniciará.Esto funciona en Windows 7:
SET PATH=%PATH%;C:\CmdShortcuts
probado escribiendo echo% PATH% y funcionó, bien. también se establece si abre un nuevo cmd, ya no es necesario reiniciar esos molestos :)
fuente
setx
porque hereda el entorno actual que puede tener variables que se han modificado y no lo que quiero permanentemente. Hacerlo de esta manera me permite evitar reiniciar la consola para usar las variables, al tiempo que evito el problema de no tenerlas disponibles globalmente en el futuro.Use "setx" y reinicie el indicador de cmd
Hay una herramienta de línea de comando llamada " setx " para este trabajo. Es para leer y escribir variables env. Las variables persisten después de cerrar la ventana de comandos.
"Crea o modifica variables de entorno en el entorno del usuario o del sistema, sin necesidad de programación o secuencias de comandos. El comando setx también recupera los valores de las claves de registro y los escribe en archivos de texto".
Nota: las variables creadas o modificadas por esta herramienta estarán disponibles en futuras ventanas de comandos pero no en la ventana de comandos actual de CMD.exe. Entonces, tienes que reiniciar.
Si
setx
falta:O modificar el registro
MSDN dice:
fuente
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\VARIABLE
actual del usuario:HKEY_CURRENT_USER\Environment\VARIABLE
%PATH%
, ¡setx
puede truncar esto a 1024 bytes! Y así, su noche se desvanecióLlamar a esta función me ha funcionado:
fuente
El mejor método que se me ocurrió fue simplemente hacer una consulta del Registro. Aquí está mi ejemplo.
En mi ejemplo, hice una instalación usando un archivo Batch que agregó nuevas variables de entorno. Tenía que hacer cosas con esto tan pronto como se completara la instalación, pero no pude generar un nuevo proceso con esas nuevas variables. Probé generar otra ventana del explorador y volví a llamar a cmd.exe y funcionó, pero en Vista y Windows 7, Explorer solo se ejecuta como una instancia única y normalmente como la persona que inició sesión. Esto fallará con la automatización ya que necesito mis créditos administrativos para hacer cosas independientemente de la ejecución desde el sistema local o como administrador en la caja. La limitación a esto es que no maneja cosas como la ruta, esto solo funcionó en variables de entorno simples. Esto me permitió usar un lote para ir a un directorio (con espacios) y copiar archivos ejecutados .exes y etc. Esto fue escrito hoy desde los recursos de mayo en stackoverflow.com
Llamadas de lote originales a nuevo lote:
testenvget.cmd SDROOT (o cualquiera que sea la variable)
También hay otro método que se me ocurrió a partir de varias ideas diferentes. Por favor ver más abajo. Básicamente, esto obtendrá la variable de ruta más nueva del registro, sin embargo, esto causará una serie de problemas porque la consulta del registro dará variables en sí misma, lo que significa que en todas partes hay una variable que no funcionará, por lo que para combatir este problema I básicamente doblar el camino. Muy asqueroso. El método más preferido sería hacer: Establecer ruta =% Ruta%; C: \ Archivos de programa \ Software .... \
Independientemente de aquí esté el nuevo archivo por lotes, tenga cuidado.
fuente
La forma más fácil de agregar una variable a la ruta sin reiniciar para la sesión actual es abrir el símbolo del sistema y escribir:
y presione enter.
para verificar si su variable está cargada, escriba
y presione enter. Sin embargo, la variable solo será una parte de la ruta hasta que reinicie.
fuente
Es posible hacer esto sobrescribiendo la tabla de entorno dentro de un proceso específico.
Como prueba de concepto, escribí esta aplicación de muestra, que acaba de editar una sola variable de entorno (conocida) en un proceso cmd.exe:
Salida de muestra:
Notas
Este enfoque también se limitaría a restricciones de seguridad. Si el objetivo se ejecuta a una elevación más alta o una cuenta más alta (como SYSTEM), entonces no tendríamos permiso para editar su memoria.
Si desea hacer esto en una aplicación de 32 bits, los desplazamientos codificados anteriormente cambiarían a 0x10 y 0x48 respectivamente. Estas compensaciones se pueden encontrar volcando las estructuras _PEB y _RTL_USER_PROCESS_PARAMETERS en un depurador (por ejemplo, en WinDbg
dt _PEB
ydt _RTL_USER_PROCESS_PARAMETERS
)Para cambiar la prueba de concepto en lo que el OP necesita, solo enumeraría las variables actuales del entorno del sistema y del usuario (como se documenta en la respuesta de @ tsadok) y escribiría la tabla de entorno completa en la memoria del proceso de destino.
Editar: el tamaño del bloque de entorno también se almacena en la estructura _RTL_USER_PROCESS_PARAMETERS, pero la memoria se asigna en el montón del proceso. Entonces, desde un proceso externo no tendríamos la capacidad de cambiar su tamaño y hacerlo más grande. Jugué con el uso de VirtualAllocEx para asignar memoria adicional en el proceso de destino para el almacenamiento del entorno, y pude configurar y leer una tabla completamente nueva. Desafortunadamente, cualquier intento de modificar el entorno de los medios normales se bloqueará y quemará ya que la dirección ya no apunta al montón (se bloqueará en RtlSizeHeap).
fuente
Las variables de entorno se mantienen en HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet \ Control \ Session Manager \ Environment.
Muchos de los entornos útiles, como Path, se almacenan como REG_SZ. Hay varias formas de acceder al registro, incluido REGEDIT:
REGEDIT /E <filename> "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment"
La salida comienza con números mágicos. Entonces, para buscarlo con el comando find, debe escribirse y redirigirse:
type <filename> | findstr -c:\"Path\"
Entonces, si solo desea actualizar la variable de ruta en su sesión de comando actual con las propiedades del sistema, el siguiente script por lotes funciona bien:
RefreshPath.cmd:
fuente
Intente abrir un nuevo símbolo del sistema como administrador. Esto funcionó para mí en Windows 10. (Sé que esta es una respuesta anterior, pero tuve que compartirla porque tener que escribir un script VBS solo por esto es absurdo).
fuente
El reinicio del explorador lo hizo por mí, pero solo para los nuevos terminales cmd.
El terminal en el que configuré la ruta ya podía ver la nueva variable Ruta (en Windows 7).
fuente
Lo confuso podría ser que hay algunos lugares para comenzar el cmd. En mi caso, ejecuté cmd desde el explorador de Windows y las variables de entorno no cambiaron, mientras que al iniciar cmd desde "ejecutar" (tecla de Windows + r) las variables de entorno cambiaron .
En mi caso, solo tuve que eliminar el proceso del explorador de Windows desde el administrador de tareas y luego reiniciarlo nuevamente desde el administrador de tareas .
Una vez que hice esto, tuve acceso a la nueva variable de entorno desde un cmd que se generó desde el explorador de Windows.
fuente
Uso el siguiente código en mis scripts por lotes:
Al usar SET después de SETX , es posible usar la variable "local" directamente sin reiniciar la ventana de comandos. Y en la próxima ejecución, se usará la variable de entorno.
fuente
Me gustó el enfoque seguido de chocolate, según lo publicado en la respuesta anónima de cobarde, ya que es un enfoque puramente discontinuo. Sin embargo, deja un archivo temporal y algunas variables temporales por ahí. Hice una versión más limpia para mí.
Haga un archivo en
refreshEnv.bat
algún lugar de suPATH
. Actualice su entorno de consola mediante la ejecuciónrefreshEnv
.fuente
Si se trata solo de uno (o algunos) vars específicos que desea cambiar, creo que la forma más fácil es una solución alternativa : simplemente configúrelo en su entorno Y en su sesión de consola actual
Tengo este script por lotes simple para cambiar mi Maven de Java7 a Java8 (que son ambos env. Vars) La carpeta por lotes está en mi PATH var, por lo que siempre puedo llamar ' j8 ' y dentro de mi consola y en el entorno mi JAVA_HOME var se cambia:
j8.bat:
Hasta ahora encuentro que esto funciona mejor y más fácil. Probablemente desee que esto esté en un comando, pero simplemente no está allí en Windows ...
fuente
La solución que he estado usando durante algunos años:
Editar: Woops, aquí está la versión actualizada.
fuente
No hay un camino directo, como dijo Kev. En la mayoría de los casos, es más sencillo generar otro cuadro CMD. Más molesto, los programas en ejecución tampoco están al tanto de los cambios (aunque IIRC podría haber un mensaje de transmisión para ver y ser notificado de dicho cambio).
Ha sido peor: en versiones anteriores de Windows, tenía que cerrar la sesión y volver a iniciarla para tener en cuenta los cambios ...
fuente
Utilizo este script de Powershell para agregar a la variable PATH . Creo que con un pequeño ajuste también puede funcionar en su caso.
fuente
Gracias por publicar esta pregunta que es bastante interesante, incluso en 2019 (de hecho, no es fácil renovar el cmd de shell ya que es una instancia única como se mencionó anteriormente), porque renovar las variables de entorno en Windows permite realizar muchas tareas de automatización sin tener que reiniciar manualmente la línea de comando.
Por ejemplo, usamos esto para permitir que el software se implemente y configure en una gran cantidad de máquinas que reinstalamos regularmente. Y debo admitir que tener que reiniciar la línea de comandos durante la implementación de nuestro software sería muy poco práctico y requeriría que encontremos soluciones que no sean necesariamente agradables. Vayamos a nuestro problema. Procedemos de la siguiente manera.
1 - Tenemos un script por lotes que a su vez llama un script de PowerShell como este
[archivo: task.cmd] .
cmd
> powershell.exe -executionpolicy unrestricted -File C:\path_here\refresh.ps1
2 - Después de esto, el script refresh.ps1 renueva las variables de entorno utilizando claves de registro (GetValueNames (), etc.). Luego, en el mismo script de PowerShell, solo tenemos que llamar a las nuevas variables de entorno disponibles. Por ejemplo, en un caso típico, si acabamos de instalar nodeJS antes con cmd usando comandos silenciosos, después de llamar a la función, podemos llamar directamente a npm para instalar, en la misma sesión, paquetes particulares como los siguientes.
[archivo: refresh.ps1]
Una vez que finaliza el script de PowerShell, el script de cmd continúa con otras tareas. Ahora, una cosa a tener en cuenta es que después de completar la tarea, cmd todavía no tiene acceso a las nuevas variables de entorno, incluso si el script de powershell las ha actualizado en su propia sesión. Es por eso que hacemos todas las tareas necesarias en el script de PowerShell que puede llamar a los mismos comandos que cmd, por supuesto.
fuente
Editar: esto solo funciona si los cambios en el entorno que está haciendo son el resultado de ejecutar un archivo por lotes.
Si un archivo por lotes comienza con
SETLOCAL
, siempre se desenredará en su entorno original al salir, incluso si olvida llamarENDLOCAL
antes de que el lote salga, o si aborta inesperadamente.Casi todos los archivos por lotes que escribo comienzan
SETLOCAL
ya que en la mayoría de los casos no quiero que los efectos secundarios de los cambios en el entorno permanezcan. En los casos en que quiero que ciertos cambios de variables de entorno se propaguen fuera del archivo por lotes, mi último seENDLOCAL
ve así:fuente
Para resolver esto, he cambiado la variable de entorno usando AMBOS setx y set, y luego reinicié todas las instancias de explorer.exe. De esta forma, cualquier proceso iniciado posteriormente tendrá la nueva variable de entorno.
Mi secuencia de comandos por lotes para hacer esto:
El problema con este enfoque es que todas las ventanas del explorador que están abiertas actualmente se cerrarán, lo que probablemente sea una mala idea. Pero vea la publicación de Kev para saber por qué esto es necesario
fuente