it-swarm.dev

¿Por qué Windows no puede manejar una variable de entorno en la ruta?

Mi colega y yo tenemos estaciones de trabajo Dell idénticas a las de Windows XP Professional x64 edition instalado.

La variable de entorno My Path comienza con:

%Java_HOME%\bin;...

La variable Ruta de mi colega incluye el mismo directorio, especificado usando la misma variable de entorno, pero no es el primer elemento en su Ruta.

Si accedo a las propiedades del sistema -> variables de entorno y cambio el valor de mi variable Java_HOME, la versión de Java encontrada en la línea de comandos cambia como esperaba. Esto es comenzar una nueva ventana de consola, para asegurarse de recoger los cambios.

Pero en la máquina de mi colega, no lo hace. Continúa encontrando su versión anterior de Java hasta que muestra su variable Path y la guarda (incluso si no la modifica). (Nuevamente, esto es cuando se inicia una nueva ventana de consola).

He estado observando esta inconsistencia en Windows durante aproximadamente 6 meses y tengo mucha curiosidad al respecto. Tenemos demasiadas versiones de Windows en nuestra oficina, por lo que rara vez he tenido la oportunidad de ver que esto suceda en dos máquinas que ejecutan exactamente la misma versión de SO, hasta ahora.

¿Qué está causando esto? ¿Por qué su máquina no vuelve a evaluar la ruta, usando el nuevo Java_HOME, cuando la mía lo hace?

(¿Es porque no es lo primero en el Sendero? Si es así, ¿cómo podría ser eso y por qué? Haría más pruebas para verificarlo, pero creo que ahora está harto de eso y quisiera volver al trabajo .)

43
skiphoppy

Su ruta es la concatenación de la ruta del sistema seguida por la ruta del usuario. Además, las variables de entorno del sistema pueden no contener referencias a las variables de entorno del usuario, y cualquiera de dichas referencias no se expandirá . Para obtener el resultado deseado, inserte la referencia a% Java_HOME% en la variable de entorno PATH del usuario , o cree una variable de este tipo si aún no existe .

Quizás un ejemplo simplificado aclare esto. Supongamos que el entorno SISTEMA es

ProgramFiles = C:\Program Files
SystemRoot = C:\WINDOWS
PATH = %SystemRoot%\SYSTEM32

y el entorno del usuario JSmith es

Java_HOME = %ProgramFiles%\Java\bin
USERPROFILE = C:\USERS\JSmith
PATH = %Java_HOME%\bin;%USERPROFILE%\bin

entonces el camino resultante sería

C:\WINDOWS\SYSTEM32;C:\Program Files\Java\bin;C:\Users\JSmith\bin

como se desee.

37
JPaget

Compruebe en el registro de Windows bajo esta clave:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Environment

SI la variable de entorno necesita ser expandida (aquí:% Java_HOME%)

entonces la variable debe establecerse como un valor REG_EXPAND_SZ valor.

Si usa reg.exe a través de la línea de comandos para agregar/editar los valores del registro, el valor predeterminado es escribir REG_SZ. Especifique el tipo REG_EXPAND_SZ utilizando la opción reg add /t REG_EXPAND_SZ.

15
climenole

Existe un problema definido con la expansión de las variables de entorno dentro de la variable PATH cuando la variable se expande a una ruta que contiene espacios.

Creamos nuestras propias variables de nivel de sistema como "OUR_ROOT = c:\MyRoot" y luego lo usamos en la ruta de acceso del sistema como "PATH =;% OUR_ROOT%\bin;" y eso se expande correctamente a "PATH =; c:\MyRoot\bin;". Hasta ahora no hay problema.

Pero, en Windows 7 (32 bits), instalé un producto y creé variables de entorno del sistema como esta:

STUDIO_BIN=C:\program files\Company Name\Product Name 10.4\bin

y lo agregó a la variable PATH del sistema:

PATH=<other path elements>;%STUDIO_BIN%;<more path elements>

Pero los valores PATH que se muestran en CMD contenían "% STUDIO_BIN%;" y no el camino expandido. El valor en Mi PC> Propiedades> Avanzado> Env.Vars también se mantuvo sin expandir. Esto significaba que no podía ejecutar programas que requerían un DLL en ese directorio.

Con solo cambiar STUDIO_BIN (a través de Mi PC> Propiedades> Avanzadas ...> Env Vars) a un nombre sin espacios incrustados:

STUDIO_BIN=C:\ProductName\bin

y luego reiniciando la ventana de CMD, la ruta es ahora:

PATH=<other path elements>;C:\ProductName\bin;<more path elements>

Otra solución es editar suficientemente la variable del sistema que está utilizando en la RUTA utilizando el cuadro de diálogo Mi PC> Propiedades> Avanzadas ...> Variables de entorno. Intenté agregar un personaje y eliminarlo para hacer un 'cambio' y luego OK, comencé un nuevo mensaje CMD y la ruta no se expandió correctamente. Luego traté de eliminar parte de la ruta, de modo que era

STUDIO_BIN=C:\Program Files\Company Name

(omitiendo "Nombre del producto 10.4") y he aquí, y he aquí, el siguiente mensaje de CMD mostró una ruta con STUDIO_BIN expandida correctamente.

Por extraño que parezca, si volví a ingresar y agregué el "Nombre del producto 10.4" a STUDIO_BIN (incluidos todos los espacios que estaban allí antes de que empecara a rastrearlo) y la ruta aún se expandió correctamente.

Evidentemente, con un cambio suficiente en su contenido, la variable PATH sufre un procesamiento adicional en el cuadro de diálogo Variables de entorno que le permite funcionar. El proceso no se realiza cuando el instalador del producto agregó la variable (que probablemente solo modificó directamente el PATH en el registro).

Estoy casi seguro de que esto también fue un problema con XP Simplemente volvió a aparecer en Windows 7 cuando estaba armando una nueva máquina de desarrollo. Al parecer no ha sido arreglado por Microsoft.

Al parecer, incluso las variables definidas por MS como% ProgramFiles% no se expandirán correctamente en la RUTA.

Esta página proporciona una posible respuesta si está configurando PATH a través de la línea de comandos o el archivo por lotes. (Encierre el comando completo después de SET entre comillas). No sé qué instalador usó el producto que instalé para configurar las variables de entorno, pero evidentemente se aplicó todo el procesamiento necesario para expandir correctamente las rutas con espacios.

Entonces, para resumir, puedes:

  • cambiar las rutas (y mover todos los archivos asociados) a rutas sin espacios, o

  • edite las variables que no se expanden en el cuadro de diálogo Variables de entorno (cambiándolas lo suficiente para que se procesen correctamente; no estoy seguro de cuánto es suficiente).

9
RobDavenport

pregunté esto en los foros de Microsoft en marzo de 2009 y nunca lo resolví:

¿Cómo usar% ProgramFiles% en la variable de entorno de ruta? :


Estoy tratando de agregar una carpeta a la variable de entorno Ruta del sistema.

quiero agregar % ProgramFiles%\SysInternals

a la variable de ruta existente:

C:\PROGRA ~ 1\Borland\Delphi5\Projects\Bpl; C:\PROGRA ~ 1\Borland\Delphi5\Bin; % SystemRoot% \system32; % SystemRoot% ;% SystemRoot %\System32\Wbem; C:\Archivos de programa\Microsoft SQL Server\80\Tools\BINN; C:\Archivos de programa\Microsoft SQL Server\80\Tools\Binn \; C:\Archivos de programa\Microsoft SQL Server\90\Tools\binn \; C:\Archivos de programa\Microsoft SQL Server\90\DTS\Binn \; C :\Archivos de programa\Microsoft SQL Server\90\Tools\Binn\VSShell\Common7\IDE \; C:\Archivos de programa\Microsoft Visual Studio 8\Common7\IDE\PrivateAssemblies \;% SYSTEMROOT%\System32\WindowsPowerShell\v1.0 \

Así que voy al lugar donde lo editas:

alt text

Y agrego mi variable a la ruta:

% Archivos de programa %\SysInternals; C:\PROGRA ~ 1\Borland\Delphi5\Projects\Bpl; (recorte)

Luego, al abrir una nueva ventana de solicitud de comando, la variable de entorno no se reemplaza con su valor real:

Ruta =% Archivos de programa %\SysInternals; C:\PROGRA ~ 1\Borland\Delphi5\Projects\Bpl (snip)>

Que puedes ver en la siguiente captura de pantalla:

alt text


Pero para responder a tu pregunta: no sé. Parece que no se puede hacer.

7
Ian Boyd

existen dos niveles de variables de entorno, global y usuario. Si tiene% Java_home% establecido como variable de entorno de usuario, pero en cambio está cambiando la variable global, no verá ninguna diferencia.

5
Sekhat

Agregue las variables de entorno mientras está conectado a la sesión/console utilizando MSTSC.

Reinicie la máquina y encontrará que sus variables de entorno habrán persistido.

Parece que hay una peculiaridad en el O/S dependiendo de cómo estaba conectado a la máquina cuando intentó cambiar la variable de entorno.

2
Justin

Asegúrese de que no haya espacios en la RUTA cuando esté definiendo sus propias variables de entorno de usuario. por ejemplo: C:\GNAT\bin; C:\GNAT\include no funcionará, debido al espacio entre ";" y "C:\GNAT\include".

2
Nij

He tenido el mismo problema, y ​​sé cómo solucionarlo, está cojo.

Solo edite su RUTA nuevamente, pero no haga ningún cambio, y vuelva a guardar la RUTA. Por alguna razón, esto hace que todas las referencias de variables de entorno anidadas se vuelvan a evaluar.

Si no funciona, hazlo unas cuantas veces más, de alguna manera simplemente funciona.

1
BAP

PATH es la concatenación de la variable PATH del usuario seguida de la variable PATH global. Para utilizar una variable dentro de otra, la primera ya debe estar configurada. Las variables de usuario se establecen antes que las variables globales (al menos aquí en mi Windows 7 de 64 bits), por lo que no puede usar variables globales en su variable PATH de usuario. Además, las variables se establecen en orden alfabético, por lo que también debe tener eso en cuenta.

1
cbarrick

Puede estar relacionado con la función "expansión de variable de entorno diferida" (o la falta de la misma), o tal vez pueda aprovechar esta función para tener siempre la solución correcta.

desde un mensaje de cmd

set /? 

y lea la sección que describe la "expansión de la variable de entorno diferida", que incluye un pequeño ejemplo para probar

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "%VAR%" == "after" @echo If you see this, it worked
)

Si no obtienes la línea de eco, entonces eso podría explicarlo ...

Sin embargo, si inicia su cmd.exe con la opción/V, entonces puede usar "!" en lugar de "%", que cambia el comportamiento

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "!VAR!" == "after" @echo If you see this, it worked
)

Para mí (ejecutándose en XP), el primer script no funcionó, pero la segunda versión sí lo hizo (con cmd.exe/V)

1
libjack

Creo realmente que Windows no puede expandir una variable en PATH porque piensa en lo que aún no está definido. Considerar:

REM Ensure variable is undefined
SET UNDEFINED=
REM And then try to expand it
ECHO UNDEFINED=%UNDEFINED%

Esta hipótesis se ajusta a mi otra observación: agregar %ProgramFiles%\Something a los usuarios PATH siempre dará como resultado la expansión esperada de %ProgramFiles%, dado que se ha definido en el entorno de la máquina en la hora de la notificación de cambio variable (debido orden de carga - MÁQUINA y luego USUARIO). Pero cuando modifica el entorno de la máquina, la expansión de la variable correcta solo ocurre en el momento del arranque (en este momento no tengo idea cómo y por qué esto no sucede de forma regular).

1
user539484

He resuelto la configuración de las variables de entorno en Sistema> Configuración avanzada> Variables de entorno .

Hay dos paneles, Usuario y Variables globales (el usuario es su nombre de usuario de Windows) y las Variables del sistema son variables globales, por lo que si establece 'Nuevo' a partir de variables del usuario, como Java_HOME y coloca su ruta a continuación, establecerá las variables incluso si es global ruta tiene archivos de programa dentro de la carpeta.

0
thunder_nemesis

Quizás lo estás haciendo mal?

Lo intenté con Windows XP Pro SP3 (32 bits). Tengo una ruta con varias apariciones de %Java_HOME% (y %JAVAFX_HOME%, etc.). Voy a la línea de comando, escribo PATH, veo las variables expandidas. Bueno.

Yo cambio el valor de Java_HOME. De vuelta a la misma ventana de línea de comandos, PATH otra vez, el mismo valor ... como se esperaba (¡por experiencia!).

Abro una nueva ventana de línea de comando, escribo PATH, gotcha, veo el nuevo valor.

No estoy seguro de cuál es el mecanismo exacto allí, pero parece que cualquier programa en ejecución, incluido cmd.exe, captura los valores de las variables de entorno en el momento del inicio y no mira hacia atrás ... (aunque creo que un programa de buen comportamiento puede Escucha los cambios de env, aunque no estoy seguro.

Puede ser visto como una característica o un error o molestia, pero así es como funciona. Oye, al menos, a diferencia de Win9X veces, ¡no tenemos que reiniciar la computadora! Y a diferencia de los tiempos de NT (IIRC), no tiene que cerrar sesión y volver.

¿Por qué la inconsistencia? Las formas de Microsoft son inescrutables ... :-P

0
PhiLho