UPDATE NO.2 - Now to the actual question: Why do nested, user-created variables fail to expand?
There's some general problems concerning variable expansion in Windows. I've already run into the same problem and found no clear, reproducible circumstances - the recursion level at which expansion fails is not consistent, special characters don't seem to play a role, etc.
The only viable workaround I found is adding variables recursion level by recursion level. That means: Try deleting all variables you want to nest into each other (including calls from PATH to your user-defined variables), and then start up from scratch. Define your basic variables (etc. ANT-HOME), commit, check if it's expanded, if it is, go on with the next level commit, check... you get the idea.
UPDATED ANSWER - Defining permanent environment variables using the CLI and GUI - Scroll down for the original answer
GUI method:
On Windows 7, just type "system" in the META-Prompt and you'll see an entry "Edit the System Environment Variables". From there, click "Environment variables". There, you can either edit the system variable PATH (bottom list) or add/edit a new PATH variable to the user environment variables.
Command line method:
To change environment variables permanently, you have to use the SETX command in the Windows command line. Unlike in other versions of Windows, it comes built-in with Windows 7. Its syntax differs a lot from SET, but it's also powerful. You'll have to be a bit careful though, it's easy to make a mess of your variables with SETX.
By default, you change user variables. You can have a PATH user environment variable that happily coexists with the system PATH variable. If you don't have it defined yet, do so by typing: SETX PATH yourpath
You can also add a value to the system variable PATH. To do this, you first need to bring up a command line with admin privileges. To do this, hit the Meta(Windows) key, type cmd
and hit CTRL
+ SHIFT
+ENTER
and confirm the UAC dialog.
To add new values to path, you can now enter
setx path "%path%;yournewpath" /m
It's important to follow that syntax! If you don't include %path% first, all existing values of path will be lost and replaced with only you new path.
The /m switch at the end sets the variable in the system environment.
Please note that you'll have to bring up a new command line to make use of your new variable.
There's also a full reference for SETX at TechNet.
OLD ANSWER
The command SET updates the variables only for the duration of the current command line session.
The correct syntax for adding a value to a variable is 'set [variable]=%[variable]%;[new value]`
Note that left of the equal sign, you have to omit the percent signs!
Source: TechNet Command-line reference for Windows Server
- Change either User or System PATH in System Properties.
- Running this batch file pulls the new PATH variables with a REG query.
- The FOR commands parse the PATH variables from the REG results.
- The current PATH is updated to the registry values.
- I use ConEmu for my consoles and it runs this batch file on each new console to refresh the PATH so a reboot isn't necessary.
@echo off
echo.
echo Refreshing PATH from registry
:: Get System PATH
for /f "tokens=2*" %%A in ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path') do set syspath=%%B
:: Get User Path
for /f "tokens=2*" %%A in ('reg query "HKCU\Environment" /v Path') do set userpath=%%B
:: Set Refreshed Path
set PATH=%userpath%;%syspath%
echo Refreshed PATH
echo %PATH%
```
The task Commands parameter in ConEmu launches C:\Windows\System32\cmd.exe with the /k switch to run the refreshpath.cmd above and then remain. That updates the path and leaves the console open.
C:\Windows\System32\cmd.exe /k refreshpath.cmd
Best Answer
The following adds 'C:\bin' to your path and then saves the new path into the Registry:
I only tested this on XP SP3, but it should work on newer version as well.
I guess a new user who logs on before the machine reboots may not get the new path.
Harry is right with his comment about %SystemRoot%, if you want to keep these, you need to pull the old value for path from the registry first: