Подтвердить что ты не робот

Перезагрузите путь в PowerShell

Если у меня запущен экземпляр PowerShell ISE, и я устанавливаю что-то, что изменяет PATH, или я изменяю его каким-либо образом вне PowerShell, тогда мне нужно перезапустить PowerShell, чтобы увидеть обновленную переменную PATH.

Есть ли способ перезагрузить путь из PowerShell, не перезапуская его?

4b9b3361

Ответ 1

Просто чтобы принести комментарий Роба, чтобы свет:

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") 

Ответ 2

Попробуйте получить путь к машине и назначьте его пути к сеансу.

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")

Ответ 3

Самый простой способ - использовать Chocolatey (бесплатно). Он работает как для CMD, так и для PowerShell. Затем вы сможете перезагрузить PATH (с расширением переменной) с помощью простой команды:

refreshenv

Установка из cmd (требует прав администратора):

@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"

Пример использования:

> SET JAVA_HOME=c:/java/jdk6
> SET PATH=%JAVA_HOME%/bin
> ECHO %PATH%
c:/java/jdk6/bin

> SET JAVA_HOME=c:/java/jdk8
> refreshenv
Refreshing environment variables from registry for cmd.exe. Please wait...Finished..
> echo %PATH%
c:/java/jdk8/bin

Ответ 4

Основываясь на ответе mpen, вот функция PowerShell:

function refresh-path {
    $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") +
                ";" +
                [System.Environment]::GetEnvironmentVariable("Path","User")
}

Тогда просто вызовите refresh-path.

Ответ 5

Если ваш путь содержит переменные среды, которые не были определены в начале сеанса, вы также захотите расширить их:

$env:Path = [System.Environment]::ExpandEnvironmentVariables([System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User"))

Для меня это было полезно после установки NVM, которая определяет и добавляет% NVM_HOME% к пути.

Чтобы довести это до логического завершения, вы можете использовать эту рекурсивную функцию для расширения:

function Expand-EnvironmentVariablesRecursively($unexpanded) {
    $previous = ''
    $expanded = $unexpanded
    while($previous -ne $expanded) {
        $previous = $expanded
        $expanded = [System.Environment]::ExpandEnvironmentVariables($previous)
    }
    return $expanded
}

А затем используйте:

$env:Path = Expand-EnvironmentVariablesRecursively([System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User"))

Я открыл вопрос, чтобы добавить это решение в refreshenv от Шоколад.

Ответ 6

Просто чтобы добавить к другим ответам, вы можете убедиться, что не добавляете лишние объединения, фильтруя на случай, если у пользователя пустой путь.

$env:Path=(
    [System.Environment]::GetEnvironmentVariable("Path","Machine"),
    [System.Environment]::GetEnvironmentVariable("Path","User")
) -match '.' -join ';'

Или, что более полезно, если вы запускаете скрипт, который добавляет к другой или нескольким переменным среды, используйте функцию для сброса их всех

function resetEnv {
    Set-Item '
        -Path (('Env:', $args[0]) -join '') '
        -Value ((
            [System.Environment]::GetEnvironmentVariable($args[0], "Machine"),
            [System.Environment]::GetEnvironmentVariable($args[0], "User")
        ) -match '.' -join ';')
}
resetEnv Path
resetEnv AppPath