Usuario vs. Variables de entorno del sistema: ¿Las variables del sistema anulan las variables del usuario?

21

Tengo derechos elevados para mi computadora portátil, pero no derechos de administrador. Se requieren derechos de administrador para modificar las variables de entorno del sistema. Esperaba que si creaba una variable de entorno de usuario con el mismo nombre que una variable de entorno del sistema, la variable de usuario anularía la variable del sistema, pero este no parece ser el caso.

Después de agregar una variable de usuario con el mismo nombre que una variable del sistema, abrí una nueva ventana de cmd y usé el comando echo para mostrar la variable. Me mostró el valor de la variable del sistema en lugar del valor de la variable de usuario.

Solo quería confirmar que este es un comportamiento esperado y entender el razonamiento detrás de esto. Esperaría que la configuración de usuario más específica anule la del sistema.

Tengo Windows 7

Chad
fuente
Cuando cambia las variables, a menudo tiene que reiniciar completamente Windows. Cambiar una variable en la configuración no cambiará los procesos en ejecución. Los nuevos procesos copian el entorno de los procesos en ejecución (dependiendo de cómo se inicien), por lo que simplemente iniciar un proceso no significa que obtenga un nuevo entorno.
Zoredache
Reinicié y aún cuando ejecuto "echo% path%" desde una ventana cmd.exe, muestra mi variable de entorno del sistema, no el valor de la variable de usuario. Entonces, eliminé la variable Usuario, o Acceso de administrador, cambié mi variable de ruta del Sistema y hice el mismo cmd de eco. El valor env actualizado se mostró sin reiniciar. Esto me dice que las variables USER no anulan las variables del sistema y que no es necesario reiniciar. Neitehr es lo que esperaba.
Chad
¿Qué procedimiento se utiliza para agregar una variable de usuario con el mismo nombre que una variable del sistema ? Algo como ?
JosefZ
JosefZ: sí, agregué las dos variables de entorno, una USUARIO y la otra SISTEMA, ambas con el mismo nombre, usando la GUI de Windows 7 similar a las pantallas que se muestran en su enlace.
Chad
@Chad ¿La respuesta que aceptó no es exactamente lo opuesto a su experiencia? ¿Cómo explicas la discrepancia?
RockPaperLizard

Respuestas:

25

De acuerdo con el artículo de MSKB Variables de entorno en Windows NT :

Las variables de entorno del usuario ... tienen prioridad sobre las variables de entorno del sistema.

Una excepción notable es la PATHvariable, que es un resultado combinado del sistema y las variables de usuario:

La ruta se construye a partir de la ruta del sistema, que se puede ver en el campo Variables de entorno del sistema en el cuadro de diálogo Sistema. La ruta del usuario se agrega a la ruta del sistema.

El artículo también analiza excepciones idénticas para la expansión de las variables LibPathy Os2LibPath, así como también cómo autoexec.batse manejan las especificadas en . Es probable que estos puntos encuentren poca relevancia en los entornos típicos de hoy.

Crédito a esta respuesta SO

Yo digo reinstalar a Mónica
fuente
2
¿Es posible hacer que la ruta del usuario anteponga la ruta del sistema?
Qwerty
3

Todo lo que Twisty Impersonator dijo en su respuesta es correcto. Se ha resaltado la idea de que la variable de ruta del usuario se ha agregado, y creo que las consecuencias de esa diferencia requieren un tratamiento adicional.

Ruta =% Ruta% (Sistema); % Path% (Usuario)

Cuando se ejecuta un programa ejecutable (o cualquier secuencia de comandos ejecutables, tales como .bat, .vbs, etc.) que no es necesario para proporcionar la ruta completa.

Por ejemplo, para ejecutar java, puede escribir cualquiera de estos:

C:/Program Files (x86)/Java/jre6/bin/java -version

java.exe -version

java -version

El primer ejemplo usa una ruta totalmente calificada. Esto siempre usará la versión de Java en esa ruta exacta.

El segundo ejemplo pasará por cada uno de los directorios en la %Path%variable de entorno, buscando un archivo ejecutable llamado java.exe. Ejecutará el primero que se encuentre y dejará de buscar. Si hay dos archivos nombrados en java.exealgún lugar del %Path%, solo se usa el primero encontrado.

El tercer ejemplo, como el segundo, iterará sobre los directorios listados en %Path%. Además, debido a que no se proporcionó una extensión de archivo, se agrega una lista de extensiones de archivo ejecutables al nombre del archivo, en el orden especificado en la %PATHEXT%variable de entorno. Si hay varios archivos con el nombre java.com, java.exe, java.bat, etc. algún lugar de la %Path%, sólo se utiliza el primero encontrado.

Puede ver la lista de extensiones de ruta ejecutables en su sistema creando el siguiente archivo por lotes:

@echo off
echo %PATHEXT%
pause

En mi máquina, estos son:

.COM; .EXE; .BAT; .CMD; .VBS; .VBE; .JS; .JSE; .WSF; .WSH; .MSC; .PY

¿Qué significa todo esto?

En marcado contraste con otras variables de entorno, la ruta del usuario no le permite anular la ruta del sistema. Todo lo contrario es el caso. De los ejemplos anteriores, hay muchos casos en los que puede cambiar la versión predeterminada de Java. Sin embargo, si ya hay una versión de Java listada en la ruta del sistema, esa es la versión que SIEMPRE se encontrará primero, porque la ruta se busca en orden, de izquierda a derecha, y la ruta del usuario se agrega a la derecha a mano, con la ruta del sistema a la izquierda.

¿Qué puedo hacer al respecto?

Si no tiene acceso a las variables de entorno del sistema, no puede anular los programas predeterminados en la ruta del sistema utilizando la ruta del usuario. (De hecho, debe ser de esta manera, o ciertos programas dejarían de funcionar correctamente y abrirían su sistema a la manipulación por software malicioso. Nadie lo quiere).

En su lugar, debe usar una ruta totalmente calificada si debe usar una versión específica.

JonathanDavidArndt
fuente
1
¿Es posible hacer que la ruta del usuario anteponga la ruta del sistema?
Qwerty
1
Ese sería un buen tema para una pregunta diferente. (Una búsqueda rápida en este sitio no reveló nada inmediatamente relevante). ¡Por favor, siéntase libre de hacer una nueva pregunta y publicar un enlace aquí en los comentarios!
JonathanDavidArndt