Команды для просмотра и настройки переменных окружения в Windows

  1. Обзор
  2. Обозначение переменных
  3. Step 1: Область видимости и место хранения переменных
    1. Процесс, пользователь и система — разные уровни
  4. Step 2: CMD (%VAR%) — просмотр и изменение переменных
    1. 2-1. Вывести все переменные процесса
    2. 2-2. Просмотреть значение переменной
    3. 2-3. Временно установить переменную (только для текущего окна CMD)
  5. Step 2-4. Постоянная установка переменных (setx)
    1. Базовый синтаксис
    2. Область пользователя (по умолчанию)
    3. Область системы (/M обязателен, требуется администратор)
  6. Step 3: Просмотр пользовательских и системных переменных в CMD
    1. Пользовательские переменные (HKCU)
    2. Системные переменные (HKLM)
  7. Step 4: Безопасное редактирование PATH (предупреждение по CMD)
  8. Step 5: PowerShell ($env:VAR) — просмотр и временная настройка
    1. 5-1. Вывести все переменные процесса
    2. 5-2. Просмотреть значение переменной
    3. 5-3. Временно установить переменную процесса
  9. Step 6: Просмотр пользовательских и системных переменных в PowerShell (самый точный способ)
    1. Пользовательские переменные (HKCU)
    2. Системные переменные (HKLM)
  10. Step 7: Постоянная установка через PowerShell (.NET API / рекомендуется)
    1. Область пользователя (User)
    2. Область системы (Machine, требуется администратор)
  11. Step 8: Безопасное изменение PATH (.NET API / рекомендуемый вариант)
  12. Step 9: Удаление переменных окружения
    1. 9-1. Удаление только из текущего процесса PowerShell
    2. 9-2. Постоянное удаление (из реестра)
      1. Пользователь
      2. Система (администратор)
  13. Step 10: Применение настроек и проверка
    1. 10-1. Проверить значение в текущем процессе
    2. 10-2. Проверить значение в CMD
    3. 10-3. Немедленно загрузить постоянное значение в текущую сессию PowerShell
  14. Step 11: Пакетная установка нескольких переменных (пользователь и система)
  15. Итоги

Обзор

Переменные окружения в Windows читаются из блока окружения, создаваемого при запуске процесса. В этой статье подробно разбираются области видимости переменных (процесс, пользователь, система), механизм их постоянного хранения, способы просмотра и изменения через CMD и PowerShell, а также то, чем именно отличаются пользовательские и системные переменные и как они отображаются в разных контекстах.


Обозначение переменных

Имя переменной Пример Описание
<<VAR_NAME>> PATH Имя целевой переменной
<<VALUE>> C:\Tools Значение, которое нужно установить

Step 1: Область видимости и место хранения переменных

Тип Место хранения Область действия Постоянство Примечание
Переменные процесса Память Только текущий процесс Временное CMD: set / PowerShell: $env:
Пользовательские переменные HKCU\Environment Текущий пользователь Постоянное setx / .NET API
Системные переменные (Machine) HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment Все пользователи Постоянное setx /M / .NET API (администратор)

Процесс, пользователь и система — разные уровни

  • Переменные процесса: видны только в текущем сеансе/процессе
  • Переменные пользователя: специфичны для учетной записи пользователя
  • Переменные системы: общие для всех пользователей
  • PATH часто отображается как объединение системного PATH и пользовательского PATH

Перед изменением значений необходимо чётко понимать, к какому уровню (scope) относится переменная.


Step 2: CMD (%VAR%) — просмотр и изменение переменных

2-1. Вывести все переменные процесса

set

2-2. Просмотреть значение переменной

echo %<<VAR_NAME>>%

2-3. Временно установить переменную (только для текущего окна CMD)

set <<VAR_NAME>>=<<VALUE>>

Step 2-4. Постоянная установка переменных (setx)

Базовый синтаксис

setx <<VAR_NAME>> "<<VALUE>>"

Область пользователя (по умолчанию)

setx <<VAR_NAME>> "<<VALUE>>"

Область системы (/M обязателен, требуется администратор)

setx <<VAR_NAME>> "<<VALUE>>" /M

Особенности setx

  • Не изменяет переменные в текущей сессии CMD
  • Значения с %PATH% разворачиваются и сохраняются как фиксированная строка
  • Из-за ограничения длины PATH возможен обрез значения (не рекомендуется для PATH)

Step 3: Просмотр пользовательских и системных переменных в CMD

Пользовательские переменные (HKCU)

reg query HKCU\Environment

Системные переменные (HKLM)

reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"

Использование reg query позволяет видеть «сырые» значения в каждом уровне, без объединения.


Step 4: Безопасное редактирование PATH (предупреждение по CMD)

Следующая операция — рискованный пример и не рекомендуется:

# setx PATH "%PATH%;C:\Tools"

Причины:

  • %PATH% разворачивается и сохраняется как статический текст
  • REG_EXPAND_SZ может быть преобразован в REG_SZ, что приводит к потере ссылок вроде %SystemRoot%
  • При длинном PATH значение может быть обрезано

Редактировать PATH следует через PowerShell и .NET API (см. далее).


Step 5: PowerShell ($env:VAR) — просмотр и временная настройка

5-1. Вывести все переменные процесса

Get-ChildItem Env:

5-2. Просмотреть значение переменной

$env:<<VAR_NAME>>

5-3. Временно установить переменную процесса

$env:<<VAR_NAME>> = "<<VALUE>>"

Step 6: Просмотр пользовательских и системных переменных в PowerShell (самый точный способ)

Пользовательские переменные (HKCU)

Get-ItemProperty "HKCU:\Environment"

Системные переменные (HKLM)

Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"

Step 7: Постоянная установка через PowerShell (.NET API / рекомендуется)

Область пользователя (User)

[System.Environment]::SetEnvironmentVariable("<<VAR_NAME>>","<<VALUE>>","User")

Область системы (Machine, требуется администратор)

[System.Environment]::SetEnvironmentVariable("<<VAR_NAME>>","<<VALUE>>","Machine")

Преимущества:

  • Нет обрезания PATH
  • Сохраняется тип REG_EXPAND_SZ, где это применимо
  • Изменения выполняются безопасно и предсказуемо

Step 8: Безопасное изменение PATH (.NET API / рекомендуемый вариант)

$add = "C:\Tools"
$current = [System.Environment]::GetEnvironmentVariable("PATH","Machine")
$new = ($current.TrimEnd(';') + ';' + $add).Trim(';')
[System.Environment]::SetEnvironmentVariable("PATH",$new,"Machine")

Step 9: Удаление переменных окружения

9-1. Удаление только из текущего процесса PowerShell

Remove-Item Env:<<VAR_NAME>> -ErrorAction SilentlyContinue

9-2. Постоянное удаление (из реестра)

Пользователь

Remove-ItemProperty -Path "HKCU:\Environment" -Name "<<VAR_NAME>>" -ErrorAction SilentlyContinue

Система (администратор)

Remove-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" -Name "<<VAR_NAME>>" -ErrorAction SilentlyContinue

Step 10: Применение настроек и проверка

10-1. Проверить значение в текущем процессе

Get-ChildItem Env:<<VAR_NAME>>

10-2. Проверить значение в CMD

echo %<<VAR_NAME>>%

10-3. Немедленно загрузить постоянное значение в текущую сессию PowerShell

$env:<<VAR_NAME>> = [System.Environment]::GetEnvironmentVariable("<<VAR_NAME>>","User")

Step 11: Пакетная установка нескольких переменных (пользователь и система)

# Пользовательские переменные
$vars = @{
  "APPDATA_DIR" = "C:\AppData"
  "LOG_PATH"    = "C:\Logs"
  "TOOLS"       = "C:\Tools"
}
foreach ($v in $vars.GetEnumerator()) {
  [System.Environment]::SetEnvironmentVariable($v.Key,$v.Value,"User")
}

# Системные переменные (администратор)
$sysVars = @{
  "JAVA_HOME" = "C:\Program Files\Java\<<VALUE>>"
}
foreach ($v in $sysVars.GetEnumerator()) {
  [System.Environment]::SetEnvironmentVariable($v.Key,$v.Value,"Machine")
}

Итоги

  • Переменные процесса, пользователя и системы существуют независимо друг от друга.
  • CMD и PowerShell могут отображать разные (иногда объединённые) значения.
  • Реальные значения по уровням удобнее всего смотреть через HKCU/HKLM.
  • setx подходит для постоянного хранения, но плохо подходит для PATH (развёртывание и обрезание).
  • Использование .NET API (SetEnvironmentVariable) — самый безопасный и надёжный способ управления переменными окружения.