Обновить путь в PowerShell

160

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

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

грабить
источник

Ответы:

226

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

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") 
mpen
источник
29
Если вы используете шоколадный, и он загружается в свой профиль, есть более простая команда: refreshenv. Это в основном запускает более подробную версию комментария Роба.
kumarharsh
3
если вы устанавливаете сам шоколад и другие приложения через шоколад в том же скрипте, который изменяет переменную PATH, это refreshenvне сработает. В refreshenvработает только на subseqent оболочек открыты.
Фрэнк Фу
Проблема с шоколадом в том, что вы не можете использовать его на предприятиях, он может очень помочь с автоматической установкой приложений, и когда я ищу помощь, я обнаружил такие неродные решения, как это ...
Тибо Луисон,
73

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

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
Шэй Леви
источник
55
Спасибо, что сработало! У меня также была переменная пользовательской среды с именем path, поэтому мне пришлось сделать это: [System.Environment] :: GetEnvironmentVariable ("Path", "Machine") + ";" + [System.Environment] :: GetEnvironmentVariable ("Путь", "Пользователь")
ограбление
27

Самый простой способ - использовать 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
Аркадиуш Пшеходски
источник
9
refreshenvу меня не сработало (Windows 10). Мне все равно пришлось открыть новое окно, чтобы оно вступило в силу.
Питер Мортенсен
1
Тестировал и пользуюсь именно на Windows 10, мне он пригодится довольно часто. Пример использования, который я сделал, не подготовлен, он печатается с моей консоли. Возможно, в вашем случае это своего рода конфликт между пользовательскими и системными переменными? Кроме того, как я заметил, в мультиконсольном env (например, Conemu) он влияет только на текущую консоль.
Аркадиуш Пшеходски
refreshenvтоже здесь не работает. Работа над некоторыми сценариями в среде Windows Sandbox, и путь просто отказывается обновляться, если не запущен новый сеанс PS.
Рис Мерсер,
6

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

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

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

Тьяарт
источник
4

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

$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
Хэшбраун
источник
3

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

$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из Chocolatey.

Грэм
источник