Answers:
只是为了揭露Rob的评论:
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
refreshenv
。这基本上运行了rob注释的更详尽的版本。
refreshenv
没有用。答案(“ Robs评论”)很好地解决了问题。因此,在某些情况下,一种方法有效而另一种无效...
refreshenv
则将无法正常工作。在refreshenv
上subseqent壳仅适用打开。
尝试获取机器路径并将其分配给会话的路径。
$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
refreshenv
不适用于我(Windows 10)。我仍然必须打开一个新窗口才能使其生效。
如果您的路径包含在会话开始时未定义的环境变量,则也将要扩展它们:
$env:Path = [System.Environment]::ExpandEnvironmentVariables([System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User"))
对我来说,这在安装NVM之后很有用,该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