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%.