Настройка переменной пути Windows PowerShell
Я обнаружил, что установка переменной среды PATH влияет только на старую командную строку. PowerShell, похоже, имеет разные настройки среды. Как изменить переменные среды для PowerShell (v1)?
Замечания:
Я хочу сделать свои изменения постоянными, поэтому мне не нужно устанавливать их каждый раз, когда я запускаю PowerShell. Есть ли в PowerShell файл профиля? Что-то вроде профиля Bash в Unix?
24 ответа
Изменение фактических переменных среды может быть сделано с помощью env: namespace / drive
Информация. Например, этот код обновит переменную среды пути:
$env:Path = "SomeRandomPath";
Есть способы сделать настройки среды постоянными, но если вы используете их только из PowerShell, вероятно, гораздо лучше использовать свой профиль для инициализации настроек. При запуске PowerShell запускает любые файлы .ps1, которые он находит в каталоге WindowsPowerShell в папке "Мои документы". Обычно у вас уже есть файл profile.ps1. Путь на моем компьютере
c:\Users\JaredPar\Documents\WindowsPowerShell\profile.ps1
Если какое-то время во время сеанса PowerShell вам необходимо временно добавить переменную среды PATH, вы можете сделать это следующим образом:
$env:Path += ";C:\Program Files\GnuWin32\bin"
Вы также можете постоянно изменять пользовательские / системные переменные среды (т.е. они будут постоянными при перезапуске оболочки) следующим образом:
### Modify a system environment variable ###
[Environment]::SetEnvironmentVariable
("Path", $env:Path, [System.EnvironmentVariableTarget]::Machine)
### Modify a user environment variable ###
[Environment]::SetEnvironmentVariable
("INCLUDE", $env:INCLUDE, [System.EnvironmentVariableTarget]::User)
### Usage from comments - add to the system environment variable ###
[Environment]::SetEnvironmentVariable(
"Path",
[Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine) + ";C:\bin",
[EnvironmentVariableTarget]::Machine)
Из командной строки PowerShell:
setx PATH "$env:path;\the\directory\to\add" -m
Вы должны увидеть текст:
SUCCESS: Specified value was saved.
Перезапустите сеанс, и переменная будет доступна. setx
также может быть использован для установки произвольных переменных. Тип setx /?
в подсказке для документации.
Прежде чем связываться с вашим путем таким образом, убедитесь, что вы сохранили копию существующего пути, выполнив $env:path >> a.out
в командной строке PowerShell.
Не создавайте себе головной боли, вам нужно простое однострочное решение для добавления постоянной переменной среды (откройте PowerShell в повышенном режиме):
[Environment]::SetEnvironmentVariable("NewEnvVar", "NewEnvValue", "Machine")
закройте сеанс и откройте его снова, чтобы все было сделано
в случае, если вы хотите изменить / изменить это:
[Environment]::SetEnvironmentVariable("oldEnvVar", "NewEnvValue", "Machine")
в случае, если вы хотите удалить / удалить это:
[Environment]::SetEnvironmentVariable("oldEnvVar", "", "Machine")
Как и ответ JeanT, я хотел абстрагироваться от добавления пути. В отличие от ответа JeanT, мне нужно, чтобы он работал без взаимодействия с пользователем. Другое поведение, которое я искал:
- Обновления
$env:Path
поэтому изменение вступает в силу в текущем сеансе - Сохраняет изменение переменной среды для будущих сессий
- Не добавляет повторный путь, если такой же путь уже существует
Если это полезно, вот оно:
function Add-EnvPath {
param(
[Parameter(Mandatory=$true)]
[string] $Path,
[ValidateSet('Machine', 'User', 'Session')]
[string] $Container = 'Session'
)
if ($Container -ne 'Session') {
$containerMapping = @{
Machine = [EnvironmentVariableTarget]::Machine
User = [EnvironmentVariableTarget]::User
}
$containerType = $containerMapping[$Container]
$persistedPaths = [Environment]::GetEnvironmentVariable('Path', $containerType) -split ';'
if ($persistedPaths -notcontains $Path) {
$persistedPaths = $persistedPaths + $Path | where { $_ }
[Environment]::SetEnvironmentVariable('Path', $persistedPaths -join ';', $containerType)
}
}
$envPaths = $env:Path -split ';'
if ($envPaths -notcontains $Path) {
$envPaths = $envPaths + $Path | where { $_ }
$env:Path = $envPaths -join ';'
}
}
Проверьте мою суть для соответствующего Remove-EnvPath
функция.
Хотя текущий принятый ответ работает в том смысле, что переменная пути постоянно обновляется из контекста PowerShell, на самом деле она не обновляет переменную среды, хранящуюся в реестре Windows.
Чтобы достичь этого, вы также можете использовать PowerShell:
$oldPath=(Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).Path
$newPath=$oldPath+’;C:\NewFolderToAddToTheList\’
Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH –Value $newPath
Больше информации в блоге Используйте PowerShell для изменения вашего экологического пути.
Если вы используете расширения сообщества PowerShell, правильная команда для добавления пути к пути переменной среды:
Add-PathVariable "C:\NewFolderToAddToTheList" -Target Machine
Все ответы, предлагающие постоянное изменение, имеют одну и ту же проблему: они нарушают значение реестра пути.
SetEnvironmentVariable
поворачивает REG_EXPAND_SZ
значение %SystemRoot%\system32
в REG_SZ
ценность C:\Windows\system32
,
Любые другие переменные в пути также будут потеряны. Добавление новых с помощью %myNewPath%
больше не будет работать
Вот скрипт Set-PathVariable.ps1
что я использую для решения этой проблемы:
[CmdletBinding(SupportsShouldProcess=$true)]
param(
[parameter(Mandatory=$true)]
[string]$NewLocation)
Begin
{
#requires –runasadministrator
$regPath = "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
$hklm = [Microsoft.Win32.Registry]::LocalMachine
Function GetOldPath()
{
$regKey = $hklm.OpenSubKey($regPath, $FALSE)
$envpath = $regKey.GetValue("Path", "", [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames)
return $envPath
}
}
Process
{
# Win32API error codes
$ERROR_SUCCESS = 0
$ERROR_DUP_NAME = 34
$ERROR_INVALID_DATA = 13
$NewLocation = $NewLocation.Trim();
If ($NewLocation -eq "" -or $NewLocation -eq $null)
{
Exit $ERROR_INVALID_DATA
}
[string]$oldPath = GetOldPath
Write-Verbose "Old Path: $oldPath"
# Check whether the new location is already in the path
$parts = $oldPath.split(";")
If ($parts -contains $NewLocation)
{
Write-Warning "The new location is already in the path"
Exit $ERROR_DUP_NAME
}
# Build the new path, make sure we don't have double semicolons
$newPath = $oldPath + ";" + $NewLocation
$newPath = $newPath -replace ";;",""
if ($pscmdlet.ShouldProcess("%Path%", "Add $NewLocation")){
# Add to the current session
$env:path += ";$NewLocation"
# Save into registry
$regKey = $hklm.OpenSubKey($regPath, $True)
$regKey.SetValue("Path", $newPath, [Microsoft.Win32.RegistryValueKind]::ExpandString)
Write-Output "The operation completed successfully."
}
Exit $ERROR_SUCCESS
}
Я объясню проблему более подробно в блоге.
МОЕ ПРЕДЛОЖЕНИЕ ЭТО ОДИН, Я ПРОВЕРИЛ ЭТО, ЧТОБЫ ДОБАВИТЬ C:\oracle\x64\bin в Path навсегда, и это прекрасно работает.
$ENV:PATH
Первый способ это просто сделать:
$ENV:PATH=”$ENV:PATH;c:\path\to\folder”
Но это изменение не является постоянным, $env:path по умолчанию вернется к тому, что было раньше, как только вы закроете свой терминал powershell и снова откроете его. Это потому, что вы применили изменения на уровне сеанса, а не на уровне источника (то есть на уровне реестра). Чтобы просмотреть глобальное значение $env:path, выполните:
Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH
или, более конкретно:
(Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH).path
Теперь, чтобы изменить это, сначала мы фиксируем исходный путь, который необходимо изменить:
$oldpath = (Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH).path
Теперь мы определяем, как должен выглядеть новый путь, в этом случае мы добавляем новую папку:
$newpath = “$oldpath;c:\path\to\folder”
Примечание. Убедитесь, что $ newpath выглядит так, как вы хотите, а если нет, то вы можете повредить свою ОС.
Теперь примените новое значение:
Set-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH -Value $newPath
Теперь сделайте еще одну последнюю проверку, чтобы выглядело так, как вы ожидаете:
(Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH).Path
Теперь вы можете перезапустить свой терминал powershell (или даже перезагрузить компьютер) и убедиться, что он не возвращается к своему старому значению. Обратите внимание, что порядок путей может измениться в алфавитном порядке, поэтому убедитесь, что вы проверили всю строку, чтобы упростить ее, вы можете разбить выходные данные на строки, используя точку с запятой в качестве разделителя:
($env:path).split(“;”)
Опираясь на ответ @Michael Kropat, я добавил параметр для добавления нового пути к существующему PATH
переменная и проверка, чтобы избежать добавления несуществующего пути:
function Add-EnvPath {
param(
[Parameter(Mandatory=$true)]
[string] $Path,
[ValidateSet('Machine', 'User', 'Session')]
[string] $Container = 'Session',
[Parameter(Mandatory=$False)]
[Switch] $Prepend
)
if (Test-Path -path "$Path") {
if ($Container -ne 'Session') {
$containerMapping = @{
Machine = [EnvironmentVariableTarget]::Machine
User = [EnvironmentVariableTarget]::User
}
$containerType = $containerMapping[$Container]
$persistedPaths = [Environment]::GetEnvironmentVariable('Path', $containerType) -split ';'
if ($persistedPaths -notcontains $Path) {
if ($Prepend) {
$persistedPaths = ,$Path + $persistedPaths | where { $_ }
[Environment]::SetEnvironmentVariable('Path', $persistedPaths -join ';', $containerType)
}
else {
$persistedPaths = $persistedPaths + $Path | where { $_ }
[Environment]::SetEnvironmentVariable('Path', $persistedPaths -join ';', $containerType)
}
}
}
$envPaths = $env:Path -split ';'
if ($envPaths -notcontains $Path) {
if ($Prepend) {
$envPaths = ,$Path + $envPaths | where { $_ }
$env:Path = $envPaths -join ';'
}
else {
$envPaths = $envPaths + $Path | where { $_ }
$env:Path = $envPaths -join ';'
}
}
}
}
Это устанавливает путь для текущего сеанса и предлагает пользователю добавить его навсегда:
function Set-Path {
param([string]$x)
$Env:Path+= ";" + $x
Write-Output $Env:Path
$write = Read-Host 'Set PATH permanently ? (yes|no)'
if ($write -eq "yes")
{
[Environment]::SetEnvironmentVariable("Path",$env:Path, [System.EnvironmentVariableTarget]::User)
Write-Output 'PATH updated'
}
}
Вы можете добавить эту функцию в свой профиль по умолчанию, (Microsoft.PowerShell_profile.ps1
), обычно расположенный по адресу %USERPROFILE%\Documents\WindowsPowerShell
,
Только ответы, которые помещают значение в реестр, влияют на постоянное изменение (поэтому большинство ответов в этом потоке, включая принятый ответ, не влияют навсегда наPath
).
Следующая функция работает как для Path
/ PSModulePath
и для User
/ System
типы. Он также по умолчанию добавит новый путь к текущему сеансу.
function AddTo-Path {
param (
[string]$PathToAdd,
[Parameter(Mandatory=$true)][ValidateSet('System','User')][string]$UserType,
[Parameter(Mandatory=$true)][ValidateSet('Path','PSModulePath')][string]$PathType
)
# AddTo-Path "C:\XXX" "PSModulePath" 'System'
if ($UserType -eq "System" ) { $RegPropertyLocation = 'HKLM:\System\CurrentControlSet\Control\Session Manager\Environment' }
if ($UserType -eq "User" ) { $RegPropertyLocation = 'HKCU:\Environment' } # also note: Registry::HKEY_LOCAL_MACHINE\ format
$PathOld = (Get-ItemProperty -Path $RegPropertyLocation -Name $PathType).$PathType
"`n$UserType $PathType Before:`n$PathOld`n"
$PathArray = $PathOld -Split ";" -replace "\\+$", ""
if ($PathArray -notcontains $PathToAdd) {
"$UserType $PathType Now:" # ; sleep -Milliseconds 100 # Might need pause to prevent text being after Path output(!)
$PathNew = "$PathOld;$PathToAdd"
Set-ItemProperty -Path $RegPropertyLocation -Name $PathType -Value $PathNew
Get-ItemProperty -Path $RegPropertyLocation -Name $PathType | select -ExpandProperty $PathType
if ($PathType -eq "Path") { $env:Path += ";$PathToAdd" } # Add to Path also for this current session
if ($PathType -eq "PSModulePath") { $env:PSModulePath += ";$PathToAdd" } # Add to PSModulePath also for this current session
"`n$PathToAdd has been added to the $UserType $PathType"
}
else {
"'$PathToAdd' is already in the $UserType $PathType. Nothing to do."
}
}
# Add "C:\XXX" to User Path (but only if not already present)
AddTo-Path "C:\XXX" "User" "Path"
# Just show the current status by putting an empty path
AddTo-Path "" "User" "Path"
В Powershell можно перейти к каталогу переменных среды, набрав:
Set-Location Env:
Это приведет вас в каталог Env:>. Из этого каталога:
Чтобы увидеть все переменные среды, введите:
Env:\> Get-ChildItem
Чтобы увидеть конкретную переменную среды, введите:
Env:\> $Env:<variable name>, e.g. $Env:Path
Чтобы установить переменную среды, введите:
Env:\> $Env:<variable name> = "<new-value>", e.g. $Env:Path="C:\Users\"
Чтобы удалить переменную среды, введите:
Env:\> remove-item Env:<variable name>, e.g. remove-item Env:SECRET_KEY
Более подробная информация здесь: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_environment_variables?view=powershell-6
Как упоминал здесь Jonathan, важно запустить команду / скрипт с повышенными правами, чтобы иметь возможность изменять переменные среды для "машины", но выполнение некоторых команд с повышенными правами необязательно выполнять с помощью расширений сообщества, поэтому я бы хотел чтобы изменить и расширить ответ JeanT таким образом, что изменение машинных переменных также может быть выполнено, даже если сам скрипт не запущен с повышенными правами:
function Set-Path ([string]$newPath, [bool]$permanent=$false, [bool]$forMachine=$false )
{
$Env:Path += ";$newPath"
$scope = if ($forMachine) { 'Machine' } else { 'User' }
if ($permanent)
{
$command = "[Environment]::SetEnvironmentVariable('PATH', $env:Path, $scope)"
Start-Process -FilePath powershell.exe -ArgumentList "-noprofile -command $Command" -Verb runas
}
}
Для ясности: в Windows 1990-х годов нажмите кнопку " Пуск", щелкните правой кнопкой мыши " Этот компьютер" и выберите " Свойства", затем выберите " Дополнительные параметры системы", а затем в появившемся диалоговом окне выберите " Переменные среды" и дважды щелкните в списке. на PATH, а затем с помощью New, Edit, Move Up и Move Down все еще работают для изменения PATH. Power shell и остальная часть Windows получают все, что вы здесь установили.
Да, вы можете использовать эти новые методы, но старый все еще работает. А на базовом уровне все методы постоянного изменения управляются способами редактирования файлов реестра.
Большинство ответов не относятся к UAC. Это охватывает вопросы UAC.
Сначала установите расширения сообщества PowerShell: choco install pscx
через http://chocolatey.org/ (возможно, вам придется перезапустить среду оболочки).
Затем включите PSCX
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser #allows scripts to run from the interwebs, such as pcsx
Тогда используйте Invoke-Elevated
Invoke-Elevated {Add-PathVariable $args[0] -Target Machine} -ArgumentList $MY_NEW_DIR
Откройте PowerShell и запустите:
[Environment]::SetEnvironmentVariable("PATH", "$ENV:PATH;<path to exe>", "USER")
Эти сценарии являются идемпотентными (могут запускаться более одного раза).
Они обновляют как путь Windows, так и текущие/будущие сеансы Powershell:
Навсегда добавить путь
$targetDir="c:\bin"
$oldPath = [System.Environment]::GetEnvironmentVariable("Path","Machine")
$oldPathArray=($oldPath) -split ';'
if(-Not($oldPathArray -Contains "$targetDir")) {
write-host "Adding $targetDir to Machine Path"
$newPath = "$oldPath;$targetDir" -replace ';+', ';'
[System.Environment]::SetEnvironmentVariable("Path",$newPath,"Machine")
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","User"),[System.Environment]::GetEnvironmentVariable("Path","Machine") -join ";"
}
write-host "Windows paths:"
($env:Path).Replace(';',"`n")
Удалить путь навсегда
$targetDir="c:\bin"
$oldPath = [System.Environment]::GetEnvironmentVariable("Path","Machine")
$oldPathArray=($oldPath) -split ';'
if($oldPathArray -Contains "$targetDir") {
write-host "Removing $targetDir from Machine path"
$newPathArray = $oldPathArray | Where-Object { $_ –ne "$targetDir" }
$newPath = $newPathArray -join ";"
[System.Environment]::SetEnvironmentVariable("Path",$newPath,"Machine")
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","User"),[System.Environment]::GetEnvironmentVariable("Path","Machine") -join ";"
}
write-host "Windows paths:"
($env:Path).Replace(';',"`n")
Самое простое решение, которое я нашел, чтобы добавитьC:\vcpkg
навсегда к моей переменной env без недостатков было:
$current_PATH = [Environment]::GetEnvironmentVariable("PATH", "USER");[Environment]::SetEnvironmentVariable("PATH", "$current_PATH;C:\vcpkg;", "USER")
Ты можешь измениться"USER"
к"MACHINE"
для изменения системных env vars (нужен терминал администратора, и вам может потребоваться изменитьEnvironment
кSystem.Environment
) или даже к"PROCESS"
менять только локальныеPATH
env var (неизменяемый). Соответственно"USER"=1
"MACHINE"=2
и"PROCESS"=0
вот документация об этих командах: GetEnvironmentVariable SetEnvironmentVariable
Два других ответа, которые я нашел, но имеют серьезные недостатки, и я не рекомендую их использовать . Оба используютSETX
поскольку PowerShell реализует постоянное изменение переменной env. Недостатком этих команд является то, что вы продублируете свой системный PATH в свой локальный PATH, и вам понадобится PowerShell для их использования:
setx PATH "$($Env:PATH);C:\vcpkg;"
Дольше, но разрешите использование с другой переменной env:
$($Env:PATH).Split(';') | %{ $str += "$($_.Trim('"'));" }; %{ $str += "C:\vcpkg;" } ; setx PATH $str; %{ $str = "" }
Если вам нужно установить имя переменной динамически и только для сеанса, используйте:
New-Item env:\$key -Value $value -Force | Out-Null
Множество примеров добавления или перезаписи. Вот пример добавления пути в PowerShell для Linux, Ubuntu 18.04 с
pwsh
7.1.3
$ENV:PATH = "/home/linuxbrew/.linuxbrew/bin:$ENV:PATH"
Я специально добавляю каталог bin linuxbrew (homebrew для linux), чтобы иметь приоритет над установленной системой. Это помогло решить возникшую у меня проблему, и хотя это было самое полезное место, оно также заставило меня «экспериментировать».
Обратите внимание, что
:
- разделитель путей в Linux, тогда как в Windows (или, по крайней мере, в моих окнах) вы должны использовать
;
для PowerShell обычно.
@SBF и @Michael, пожалуйста, разрешите мне присоединиться к вечеринке.
Я попытался немного оптимизировать ваш код, чтобы сделать его более компактным.
Я полагаюсь на приведение типов в Powershell, когда оно автоматически преобразует строки в перечисляемые значения, поэтому я не определил словарь поиска.
Я также вытащил блок, который добавляет новый путь в список на основе условия, чтобы работа выполнялась один раз и сохранялась в переменной для повторного использования.
Затем он применяется постоянно или только к сеансу в зависимости от параметра $PathContainer.
Мы можем поместить блок кода в функцию или файл ps1, который мы вызываем непосредственно из командной строки. Я пошел с DevEnvAddPath.ps1.
param(
[Parameter(Position=0,Mandatory=$true)][String]$PathChange,
[ValidateSet('Machine', 'User', 'Session')]
[Parameter(Position=1,Mandatory=$false)][String]$PathContainer='Session',
[Parameter(Position=2,Mandatory=$false)][Boolean]$PathPrepend=$false
)
[String]$ConstructedEnvPath = switch ($PathContainer) { "Session"{${env:Path};} default{[Environment]::GetEnvironmentVariable('Path', $containerType);} };
$PathPersisted = $ConstructedEnvPath -split ';';
if ($PathPersisted -notcontains $PathChange) {
$PathPersisted = $(switch ($PathPrepend) { $true{,$PathChange + $PathPersisted;} default{$PathPersisted + $PathChange;} }) | Where-Object { $_ };
$ConstructedEnvPath = $PathPersisted -join ";";
}
if ($PathContainer -ne 'Session')
{
# save permanently to Machine, User
[Environment]::SetEnvironmentVariable("Path", $ConstructedEnvPath, $PathContainer);
}
#update the current session
${env:Path} = $ConstructedEnvPath;
Я делаю что-то подобное для DevEnvRemovePath.ps1.
param(
[Parameter(Position=0,Mandatory=$true)][String]$PathChange,
[ValidateSet('Machine', 'User', 'Session')]
[Parameter(Position=1,Mandatory=$false)][String]$PathContainer='Session'
)
[String]$ConstructedEnvPath = switch ($PathContainer) { "Session"{${env:Path};} default{[Environment]::GetEnvironmentVariable('Path', $containerType);} };
$PathPersisted = $ConstructedEnvPath -split ';';
if ($PathPersisted -contains $PathChange) {
$PathPersisted = $PathPersisted | Where-Object { $_ -ne $PathChange };
$ConstructedEnvPath = $PathPersisted -join ";";
}
if ($PathContainer -ne 'Session')
{
# save permanently to Machine, User
[Environment]::SetEnvironmentVariable("Path", $ConstructedEnvPath, $PathContainer);
}
#update the current session
${env:Path} = $ConstructedEnvPath;
Пока что, похоже, они работают. Буду признателен за любые отзывы.
Вопрос и различные ответы действительно заставили меня задуматься.
Редактирование раздела реестра в ответе @ali Darabi сработало для меня лучше всего, но когда у меня не было необходимых разрешений на это из Powershell. Поэтому я отредактировал его прямо в regedit.
В этом ответе я хочу подробнее остановиться на этой теме.
Перезапуска Powershell также было недостаточно для распространения изменения. Мне пришлось открыть диспетчер задач и перезапустить explorer.exe, чтобы вызвать перезагрузку реестра.
Навигация по реестру может быть довольно утомительной, поэтому, чтобы поддерживать удобство для пользователя, вы можете выполнить это из Powershell:
REG ADD "HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit" /v "LastKey" /d "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment" /f; regedit
Он устанавливает последнее открытое окно на определенный путь в реестре, так что при следующем открытии regedit он откроется с правильным ключом.
Чтобы добавить переменные среды в контейнер Windows, выполните следующие действия.
Добавьте переменную среды в файл докеров ENV MYENVVAR.
ЗАПУСК $env:MYENVVAR
docker run -e MYENVVAR=<ACTUVAL_VALUE>