在PowerShell中重新加载路径

rob*_*rob 120 console powershell powershell-ise

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

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

mpe*_*pen 157

只是为了让Rob的评论变得清晰:

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") 
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用的是巧克力,并且它已加载到您的配置文件中,则会有一个更简单的命令:`refreshenv`.这基本上运行了rob评论的[更精细版本](https://github.com/chocolatey/choco/blob/stable/src/chocolatey.resources/helpers/functions/Update-SessionEnvironment.ps1). (13认同)
  • 如果你在修改PATH变量的同一个脚本上通过chocolatey安装chocolatey本身和其他应用程序,那么`refreshenv`将不起作用.`refreshenv`仅适用于打开的后续shell. (3认同)
  • 这应该是内置的 Powershell 命令。 (3认同)
  • **是的.[Rob的评论](/sf/ask/1245615521/#comment25967553_17794885)确实撼动了Powershell Casbah. (2认同)

Sha*_*evy 69

尝试获取计算机路径并将其分配给会话的路径.

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的工作!我还有一个名为path的用户环境变量,所以我不得不这样做:[System.Environment] :: GetEnvironmentVariable("Path","Machine")+";" + [System.Environment] :: GetEnvironmentVariable("Path","User") (44认同)

Ark*_*zki 14

最简单的方法,使用Chocolatey(免费软件).它适用于CMD和PowerShell.然后,您将能够使用一个简单的命令重新加载PATH(带有可变扩展):

refreshenv
Run Code Online (Sandbox Code Playgroud)

从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"
Run Code Online (Sandbox Code Playgroud)

用法示例:

> 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
Run Code Online (Sandbox Code Playgroud)

  • refreshenv对我不起作用(Windows 10)。我仍然必须打开一个新窗口才能使其生效。 (4认同)
  • `refreshenv` 在这里也不起作用。在 Windows 沙盒环境中处理某些脚本,除非启动新的 PS 会话,否则路径拒绝更新。 (2认同)
  • 在我的情况下,refreshenv仅适用于cmd,似乎对powershell没有做任何事情 (2认同)

Has*_*own 11

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

$env:Path=(
    [System.Environment]::GetEnvironmentVariable("Path","Machine"),
    [System.Environment]::GetEnvironmentVariable("Path","User")
) -match '.' -join ';'
Run Code Online (Sandbox Code Playgroud)

或者,更有用的是,如果您正在运行添加到不同或多个环境变量的脚本,请使用函数将它们全部重置

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
Run Code Online (Sandbox Code Playgroud)


Gra*_*ham 9

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

$env:Path = [System.Environment]::ExpandEnvironmentVariables([System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User"))
Run Code Online (Sandbox Code Playgroud)

对我来说,在安装 NVM 后这很有用,它定义了 %NVM_HOME% 并将其添加到路径中。

为了得出逻辑结论,您可以使用此递归函数来扩展:

function Expand-EnvironmentVariablesRecursively($unexpanded) {
    $previous = ''
    $expanded = $unexpanded
    while($previous -ne $expanded) {
        $previous = $expanded
        $expanded = [System.Environment]::ExpandEnvironmentVariables($previous)
    }
    return $expanded
}
Run Code Online (Sandbox Code Playgroud)

然后使用:

$env:Path = Expand-EnvironmentVariablesRecursively([System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User"))
Run Code Online (Sandbox Code Playgroud)

我已经打开了一个问题,将这个解决方案添加到refreshenvChocolatey 中。


Tja*_*art 7

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

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

然后只需调用refresh-path.