如果我有一个PowerShell ISE运行的实例,我安装了一些修改PATH的东西,或者我在PowerShell之外以任何方式修改它,那么我需要重新启动PowerShell,让它看到更新的PATH变量。
有没有办法从PowerShell内部重新加载路径而不重新启动它?
如果我有一个PowerShell ISE运行的实例,我安装了一些修改PATH的东西,或者我在PowerShell之外以任何方式修改它,那么我需要重新启动PowerShell,让它看到更新的PATH变量。
有没有办法从PowerShell内部重新加载路径而不重新启动它?
当前回答
如果你的路径包含在会话开始时没有定义的环境变量,你也需要展开它们:
$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 from Chocolatey。
其他回答
如果你的路径包含在会话开始时没有定义的环境变量,你也需要展开它们:
$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 from Chocolatey。
最简单的方法就是使用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
让我们来看看罗伯的评论:
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
根据pen的回答,下面是一个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")