在PowerShell中重新加载路径

时间:2013-07-22 18:14:20

标签: powershell console powershell-ise

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

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

6 个答案:

答案 0 :(得分:136)

只是为了点亮Rob's comment

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

答案 1 :(得分:67)

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

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

答案 2 :(得分:10)

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

答案 3 :(得分:3)

基于mpen's answer,这是一个PowerShell函数:

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

然后拨打refresh-path

答案 4 :(得分:1)

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

$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"))

我已opened an issue将此解决方案添加到Chocolatey的refreshenv中。

答案 5 :(得分:0)

只需添加其他答案,您就可以确保在用户路径为空的情况下不进行过滤以添加多余的联接。

$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