¿Cómo enumerar las variables de entorno globales por separado de las variables de entorno específicas del usuario?

13

En Windows (por ejemplo, la versión 10) puede enumerar las variables de entorno con el comando

set

¿Cómo enumera solo las variables de entorno que son las mismas para todos los usuarios o solo las variables de entorno que son para el usuario o sesión actual?

RedGrittyBrick
fuente

Respuestas:

17

Las cosas son un poco más complicadas de lo que Microsoft a veces lo hace parecer.

Muchas de las variables de entorno se almacenan en el Registro. Esto significa que puede consultarlos con el regcomando

Común para todos los usuarios

reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"

Específico para la sesión de usuario actual

reg query HKCU\Environment
reg query "HKCU\Volatile Environment"

Establecido por el usuario

Si establece permanentemente su propia variable de entorno utilizando el setx variable valuecomando, se almacena en el registro pero no está disponible de inmediato.

C:\>setx test removeme

SUCCESS: Specified value was saved.

C:\>reg query "HKCU\Environment"

HKEY_CURRENT_USER\Environment
    Path    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Microsoft\WindowsApps;
    TEMP    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Temp
    TMP    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Temp
    test    REG_SZ    removeme

Si usa el set variable=valuecomando, la variable está disponible de inmediato pero no se almacena en el registro. No puede usar el regcomando para enumerarlos aunque se muestran por set. Estas variables de entorno temporales no persisten después de finalizar la sesión del símbolo del sistema.

Variables de entorno dinámico

Hay construcciones que actúan como variables de entorno que no se almacenan en el registro de esta manera. Por ejemplo:

echo %TIME%
RedGrittyBrick
fuente
1
Solo una curiosidad: ¿es posible actualizar la variable previamente agregada al registro? por ejemplo setx test removeme, algo set test %test%para que pueda tener todas las variables enumeradas con un simple set? Estaba pensando que es posible implementar un comando / script por lotes para hacerlos explícitos a pedido ...
Hastur
@Hastur: Sí, eso funcionaría para hacer que una nueva variable esté disponible de inmediato y sea persistente.
RedGrittyBrick
@hastur @RedGrittyBrick: es posible, pero definitivamente no es una línea en cmd de Windows. Si instala a chocolate que tiene refreshenv.cmdutilidad que es de 10 líneas de código y, básicamente, se consulta y refresca entradas del Registro
maoizm
¿El SETcomando muestra variables de entorno dinámico? Estoy tratando de encontrar cualquier cosa y todo lo que las herramientas de compilación de Microsoft establecieron durante una sesión, solo quiero cubrir mis bases.
Ungeheuer
2

Para una salida limpia sin líneas adicionales y espacios negros, use los siguientes comandos en cmd.exe:

Variables de entorno del usuario:

FOR /F "tokens=1,3* skip=2" %G IN ('reg query HKCU\Environment') DO @echo %G=%H %I

Variables de entorno globales (del sistema):

FOR /F "tokens=1,3* skip=2" %G IN ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"') DO @echo %G=%H %I

Funciona en Windows 7-10, y muy probablemente también en versiones anteriores.

maoizm
fuente
Gracias por esto. Tenga en cuenta que descarta parte del valor si tiene espacios en él. Entonces, una entrada de registro como VS140COMNTOOLS REG_SZ C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools aparece como justa VS140COMNTOOLS=C:\Program.
metal el
@metal gracias por informar sobre este caso de esquina. Siéntase libre de editar la respuesta si encuentra una solución para los espacios - No tengo ninguna computadora con Windows ahora
maoizm
He enviado una actualización a tal efecto. Usted o algún mod necesitarán aprobarlo.
metal
1

escriba el comando por lotes: echo% temp%

Si la variable de entorno "temp" contiene "H: \ Users \ amacm \ AppData \ Local", Windows responderá inmediatamente con lo siguiente:

H: \ Users \ amacm \ AppData \ Local

Si no hay una variable de entorno llamada "temp", Windows responderá con lo siguiente:

%temperatura%

Art McDonald
fuente