如果我有一个PowerShell ISE运行的实例,我安装了一些修改PATH的东西,或者我在PowerShell之外以任何方式修改它,那么我需要重新启动PowerShell,让它看到更新的PATH变量。

有没有办法从PowerShell内部重新加载路径而不重新启动它?


当前回答

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

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

其他回答

根据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")

为了添加到其他答案,您可以通过过滤来确保不会添加多余的连接,以防用户有空路径。

$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]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") 

如果你的路径包含在会话开始时没有定义的环境变量,你也需要展开它们:

$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。