Настройка переменной пути 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"менять только локальныеPATHenv 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>

Другие вопросы по тегам