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