如果我正在运行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
refreshenv
在这里也不起作用。正在 Windows 沙盒环境中编写一些脚本,路径只有在启动新的 PS 会话后才会更新。 - Reecerefreshenv
添加到您的PATH中。 - Johannes Schaub - litb基于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"))
我已经在Chocolatey中提出了一个问题,希望将这个解决方案添加到refreshenv
中。
refreshenv
将不起作用。refreshenv
只能在后续打开的命令行窗口中起作用。 - Frank Fu