- Обзор
- Обозначение переменных
- Step 1: Область видимости и место хранения переменных
- Step 2: CMD (%VAR%) — просмотр и изменение переменных
- Step 2-4. Постоянная установка переменных (setx)
- Step 3: Просмотр пользовательских и системных переменных в CMD
- Step 4: Безопасное редактирование PATH (предупреждение по CMD)
- Step 5: PowerShell ($env:VAR) — просмотр и временная настройка
- Step 6: Просмотр пользовательских и системных переменных в PowerShell (самый точный способ)
- Step 7: Постоянная установка через PowerShell (.NET API / рекомендуется)
- Step 8: Безопасное изменение PATH (.NET API / рекомендуемый вариант)
- Step 9: Удаление переменных окружения
- Step 10: Применение настроек и проверка
- Step 11: Пакетная установка нескольких переменных (пользователь и система)
- Итоги
Обзор
Переменные окружения в 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) — самый безопасный и надёжный способ управления переменными окружения.
