Why can't Windows handle an environment variable in Path?
Your path is the concatenation of the system path followed by the user path. Additionally, system environment variables may not contain references to user environment variables, and any such references will not be expanded. To get the desired result, insert the reference to %JAVA_HOME% in the user environment variable PATH, or create such a variable if it doesn't already exist.
Perhaps a simplified example will make this clearer. Suppose the SYSTEM environment is
ProgramFiles = C:\Program Files
SystemRoot = C:\WINDOWS
PATH = %SystemRoot%\SYSTEM32
and the User JSmith's environment is
JAVA_HOME = %ProgramFiles%\Java\bin
USERPROFILE = C:\USERS\JSmith
PATH = %JAVA_HOME%\bin;%USERPROFILE%\bin
then the resulting path would be
C:\WINDOWS\SYSTEM32;C:\Program Files\Java\bin;C:\Users\JSmith\bin
as desired.
Check in the Windows registry under this key:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Environment
IF the environment variable needs to be expanded (here: %JAVA_HOME%)
then the variable must be set as a REG_EXPAND_SZ value.
If using reg.exe via command-line to add/edit registry values, it defaults to type REG_SZ. Specify the type REG_EXPAND_SZ by using the reg add /t REG_EXPAND_SZ
option.
There is a definite problem with expanding environment variables within the PATH variable when the variable expands to a path that contains spaces.
We created our own system level variables like "OUR_ROOT=c:\MyRoot" and then used it in system PATH like "PATH=;%OUR_ROOT%\bin;" and that gets expanded correctly to "PATH=;c:\MyRoot\bin;". So far no problem.
But, on Windows 7 (32-bit), I had a product install itself and create system environment variables like this:
STUDIO_BIN=C:\program files\Company Name\Product Name 10.4\bin
and it added it to the system PATH variable:
PATH=<other path elements>;%STUDIO_BIN%;<more path elements>
But the PATH values shown in CMD contained "%STUDIO_BIN%;" and not the expanded path. The value in My Computer > Properties > Advanced > Env.Vars remained unexpanded as well. This meant I couldn't run programs that required a DLL in that directory.
By just changing STUDIO_BIN (via My Computer>Properties>Advanced ...>Env Vars) to a name without embedded spaces :
STUDIO_BIN=C:\ProductName\bin
and then restarting the CMD window, the PATH is now:
PATH=<other path elements>;C:\ProductName\bin;<more path elements>
Another solution is to sufficiently edit the system variable you are using in the PATH using the My Computer > Properties > Advanced... > Environment Variables dialog. I tried adding a character and removing it to make a 'change' and then OK'd out, started a new CMD prompt and PATH was NOT correctly expanded. I then tried deleting part of the path so it was
STUDIO_BIN=C:\Program Files\Company Name
(omitting "Product Name 10.4") and lo, and behold, the next CMD prompt showed PATH with STUDIO_BIN properly expanded!
Strangely enough, if I went back in and added the "Product Name 10.4" to STUDIO_BIN (including all the spaces that were originally there before I started mucking with it) and PATH was STILL correctly expanded.
Evidently with enough change to its contents, the PATH variable undergoes some extra processing in the Environment Variables dialog that allows it to work. Processing that's not done when the variable was added by the product's installer (which probably just modified PATH in the registry directly).
I'm almost positive this was a problem with XP as well. It just resurfaced for me in Windows 7 as I was putting together a new development machine. Apparently it has not been fixed by Microsoft.
Apparently even MS defined variables like %ProgramFiles% won't expand correctly in the PATH.
This page provides a possible answer if you're setting PATH via the command-line or batch file. (Enclose the whole command after SET in quotation marks.) I don't know what installer the product I installed used to set the environment variables, but it evidently went around whatever processing is needed to properly expand the paths with spaces.
So - to summarize, you can either:
change the paths (and move all associated files) to paths without spaces, or
edit the variables that are failing to expand in the Environment Variables dialog (changing them enough to get them to process correctly - I'm not positive how much is enough).
there are two levels of environment variables, global and user. If he has %Java_home% set as a user environment variable but is instead changing the global one, he won't see any difference.