重新加载PowerShell中的路径

265

如果我正在运行PowerShell ISE的实例,并且安装了某些修改PATH的软件或在PowerShell之外以任何方式修改了它,则需要重启PowerShell才能看到更新后的PATH变量。

有没有一种方法可以在PowerShell内重新加载路径而不需要重启它?

6个回答

390

仅仅是为了让Rob的评论更加突出:

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

48
如果您正在使用Chocolatey,并且已将其加载到个人资料中,则有一个更简单的命令:“refreshenv”。这基本上运行了Rob评论的更详细版本 - kumarharsh
10
如果你正在使用Chocolatey安装自身以及其他应用程序,并且在同一脚本中修改了PATH变量,那么refreshenv将不起作用。refreshenv只能在后续打开的命令行窗口中起作用。 - Frank Fu
1
巧克力软件的问题在于无法在企业中使用,它可以在应用程序自动安装方面提供很多帮助。当我寻求帮助时,却遇到了类似这样的非本地解决方案... - Thibault
3
这应该是内置的 Powershell 命令。 - Matej Kormuth
或者你可以在你的环境中添加一个函数,需要时随时调用该命令。 - undefined
显示剩余5条评论

94
尝试获取机器路径并将其分配给会话的路径。
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")

64
谢谢,这个方法有效!我还有一个名为“path”的用户环境变量,因此我需要这样做:[System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") - rob
路径更改很可能出现在“用户”环境变量中,而不是“机器”环境变量中。 - Niko Pasanen

60

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

19
“refreshenv”在我这里没有生效(Windows 10),我仍然需要打开一个新的窗口才能使其生效。 - Peter Mortensen
1
我在Windows 10上进行了测试和使用,它对我非常有用。我制作的用法示例并没有准备好,而是从我的控制台打印出来的。也许在你的情况下,这是用户和系统变量之间的某种冲突?另外,正如我注意到的那样,在多控制台环境(如Conemu)中,它仅影响当前控制台。 - Arkadiusz Przechodzki
2
refreshenv 在这里也不起作用。正在 Windows 沙盒环境中编写一些脚本,路径只有在启动新的 PS 会话后才会更新。 - Reece
2
在我的情况下,refreshenv仅适用于cmd,似乎在powershell中没有任何作用。 - DankCoder
如果您安装了Chocolatey,您需要将refreshenv添加到您的PATH中。 - Johannes Schaub - litb

12

基于mpen的回答,这里是一个PowerShell函数:

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

然后只需调用refresh-path即可。


11

为其他答案增加一点内容,你可以通过筛选空路径来确保不添加多余的连接。

$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

9

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接