在PowerShell中重新加载路径


144

如果我正在运行PowerShell ISE的实例,并且安装了可以修改PATH的东西,或者我在PowerShell之外以任何方式对其进行了修改,那么我需要重新启动PowerShell才能看到更新的PATH变量。

有没有一种方法可以从PowerShell内部重新加载路径而无需重新启动它?

Answers:


206

只是为了揭露Rob的评论

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") 

3
对。 Rob的评论确实震撼了Powershell Casbah。
Cecil Curry

24
如果您使用的是Chocolatey,并且已加载到您的个人资料中,则有一个更简单的命令:refreshenv。这基本上运行了rob注释的更详尽的版本
kumarharsh

由于我是Powershell新手,因此花了很多时间来弄清楚我需要做什么。疯狂地改变着这条路,这正是我所需要的。+1
cr1pto

首先,我在用巧克力...但是refreshenv没有用。答案(“ Robs评论”)很好地解决了问题。因此,在某些情况下,一种方法有效而另一种无效...
3z33etm

3
如果您要在同一脚本上通过Chocolatey安装Chocolatey本身和其他应用程序,而该脚本会修改PATH变量,refreshenv则将无法正常工作。在refreshenv上subseqent壳仅适用打开。
Frank Fu

72

尝试获取机器路径并将其分配给会话的路径。

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")

52
谢谢你的工作!我也有一个名为path的用户环境变量,因此我必须这样做:[System.Environment] :: GetEnvironmentVariable(“ Path”,“ Machine”)+“;” + [System.Environment] :: GetEnvironmentVariable(“ Path”,“ User”)
抢劫

24

最简单的方法是使用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

8
refreshenv不适用于我(Windows 10)。我仍然必须打开一个新窗口才能使其生效。
彼得·莫滕森

1
我在Windows 10上进行了准确的测试和使用,它对我很有用。我编写的用法示例尚未准备好,而是从控制台打印出来的。也许在您的情况下,用户变量和系统变量之间会发生冲突?另外,正如我所注意到的,在多控制台环境中(例如Conemu),它仅影响当前控制台。
Arkadiusz Przechodzki的

6

根据mpen的答案,这是一个PowerShell函数:

function refresh-path {
    $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") +
                ";" +
                [System.Environment]::GetEnvironmentVariable("Path","User")
}

然后打电话refresh-path


3

如果您的路径包含在会话开始时未定义的环境变量,则也将要扩展它们:

$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中添加此解决方案。


3

只是要添加其他答案,您可以通过过滤以确保用户没有空路径来确保不添加多余的联接。

$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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.