Ответ 1
Просто чтобы принести комментарий Роба, чтобы свет:
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
Если у меня запущен экземпляр PowerShell ISE, и я устанавливаю что-то, что изменяет PATH, или я изменяю его каким-либо образом вне PowerShell, тогда мне нужно перезапустить PowerShell, чтобы увидеть обновленную переменную PATH.
Есть ли способ перезагрузить путь из PowerShell, не перезапуская его?
Просто чтобы принести комментарий Роба, чтобы свет:
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
Попробуйте получить путь к машине и назначьте его пути к сеансу.
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
Самый простой способ - использовать 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
Основываясь на ответе mpen, вот функция PowerShell:
function refresh-path {
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") +
";" +
[System.Environment]::GetEnvironmentVariable("Path","User")
}
Тогда просто вызовите refresh-path
.
Если ваш путь содержит переменные среды, которые не были определены в начале сеанса, вы также захотите расширить их:
$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
от Шоколад.
Просто чтобы добавить к другим ответам, вы можете убедиться, что не добавляете лишние объединения, фильтруя на случай, если у пользователя пустой путь.
$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