What is difference between %WinDir% and %SystemRoot%?
To expand upon Mr. Dave’s answer, %SystemRoot%
is a built-in variable (along with a small handful of others like %SystemDrive%
). That is, it is not actually defined in the environment variable store at HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
in the registry.
On the other hand, %windir%
is a regular variable and is defined in the variable store as %SystemRoot%
. (There is no “real variable” counterpart to %SystemDrive%
.)
Which to use doesn’t really matter, but you may run into problems with variable expansion in batch-files, in which case you could try the other one. (I don’t recall having problems with this specifically, but it’s worth keeping in mind.)
In addition, %SystemRoot%
(and %SystemDrive%
) are set during the installation process (when you choose the destination drive) and is thus available from the earliest point when Windows is being installed whereas %windir%
is set at a later point during the install, so if you are creating some sort of custom installation (e.g., OEM, PE, etc.), you will want to use %SystemRoot%
.
On Win 7 %SystemRoot%
is a read-only system variable while %windir%
can be changed and is set by default as windir=%SystemRoot%
. The OS relies on %SystemRoot%
. According to Wikipedia, %WinDir%
pre-dates Windows NT and seems to be superseded by %SystemRoot%
.
fun fact - (on Windows 10 1809) %windir% is still so essential that you can't run anything elevated without it... which means YOU CAN'T ACTUALLY PUT IT BACK because hitting the environment variable registry apparently requires elevation :( ... fortunately safe mode did allow me to restore that variable and keep on truckin'