如果我有一个 PowerShell ISE 实例正在运行,并且我安装了一些修改 PATH 的东西,或者我在 PowerShell 之外以任何方式对其进行了修改,那么我需要重新启动 PowerShell 才能看到更新的 PATH 变量。
有没有办法从 PowerShell 中重新加载路径而不重新启动它?
如果我有一个 PowerShell ISE 实例正在运行,并且我安装了一些修改 PATH 的东西,或者我在 PowerShell 之外以任何方式对其进行了修改,那么我需要重新启动 PowerShell 才能看到更新的 PATH 变量。
有没有办法从 PowerShell 中重新加载路径而不重新启动它?
只是为了让Rob 的评论曝光:
$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
Chocolatey 中。
只是为了添加其他答案,您可以通过过滤来确保不会添加多余的连接,以防用户路径为空。
$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