Když používám unixové nástroje z příkazové řádky Windows (via msysgit), nefungují některé příkazy (třeba ssh-keygen
), protože neexistuje proměnná $HOME
, na jejíž existenci se spoléhají.
Windows má odpovídající proměnnou %HOMEPATH%
, takže %HOME%
nastavím jednoduše příkazem:
setx HOME ^%HOMEPATH^%
Její hodnotu pak snadno ověřím příkazem echo
:
C:\>echo %HOME%
\Users\vhenzl
Alternativně by asi šla použít i proměnná %USERPROFILE%
. Ta se liší tím, že má v cestě zahrnutý i disk (C:\Users\vhenzl
vs \Users\vhenzl
).
Proměnná je escapovaná symbolem ^
, aby nedošlo k jejímu okamžitému vyhodnocení, ale aby se do proměnné %HOME%
uložil výraz %HOMEPATH%
, který se vyhodnotí až při získávání hodnoty proměnné %HOME%
. Proměnná %HOME%
je takto vlastně odkazem na jinou proměnnou.
Protože set
nastaví proměnnou jen pro lokální kontext aktuálního okna cmd
. Po zavření konzole není proměnná dostupná, stejně tak není dostupná z jiných instancí cmd
.
Příkaz setx
zapisuje do registrů a proměnná je tak vytvořena natrvalo. Nově vytvořená proměnná ale není v aktuálním kontextu ihned dostupná a je tak potřeba spustit nové okno.
Uvedený příkaz setx
je použit bez přepínače, takže se proměnná vytvoří pro aktuálního uživatele (v registrech pod HKEY_CURRENT_USER\Environment
). Pokud by byl použit přepínač /M
, vytvořila by se proměnná jako systémová, tedy pro všechny uživatele (v registrech v HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
).
Proměnná %HOME%
se vytváří jako lokální, protože u systémové proměnné z nějakého důvodu nefunguje vyhodnocování proměnných:
Vytvořím dvě proměnné se stejnou hodnotou odkazující na jinou proměnou, z nichž jedna bude uživatelská a druhá systémová.
setx HOME_U ^%HOMEPATH^%
setx HOME_S ^%HOMEPATH^% /M
pak volání echo %HOME_U%
vypíše očekávanou hodnotu \Users\vhenzl
, ale echo %HOME_S%
vypíše %HOMEPATH%
.