Skip to content

Instantly share code, notes, and snippets.

@vhenzl
Last active August 29, 2015 14:22
Show Gist options
  • Save vhenzl/c876d335c456a33098f2 to your computer and use it in GitHub Desktop.
Save vhenzl/c876d335c456a33098f2 to your computer and use it in GitHub Desktop.
Nastavení proměnné ve Windows

Nastavení proměnné HOME ve Windows

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.

Proč setx a ne set?

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.

Proč uživatelská proměnná a ne systémová?

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment