【问题标题】:Reload the path in PowerShellPowershell:在 PowerShell 中重新加载路径
【发布时间】:2013-07-21 14:19:54
【问题描述】:

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

有没有办法在不重新启动的情况下从 PowerShell 中重新加载路径?

【问题讨论】:

    标签: powershell console powershell-ise


    【解决方案1】:

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

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

    【讨论】:

    • 感谢工作!我还有一个名为 path 的用户环境变量,所以我必须这样做:[System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
    • 路径更改更可能在"User" 中而不是在"Machine" 环境变量中。
    【解决方案2】:

    只是为了让Rob's comment曝光:

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

    【讨论】:

    • 如果您使用的是 Chocolatey,并且它已加载到您的个人资料中,则有一个更简单的命令:refreshenv。这基本上运行了more elaborate version rob 的评论。
    • 如果您在修改 PATH 变量的同一脚本上通过 Chocolatey 安装 Chocolatey 本身和其他应用程序,refreshenv 将不起作用。 refreshenv 仅适用于随后打开的 shell。
    • 巧克力的问题是你不能在企业中使用它,它对应用程序自动安装有很大帮助,当我寻求帮助时,我遇到了这样的非本地解决方案......跨度>
    • @FrankFu,如果我在 GUI 中更改系统环境变量中的路径怎么办?我认为通过 choco 安装时,默认情况下它总是会更改路径。所以它总是相同的脚本..
    • @Timo 对不起哥们。我不确定你是什么意思。你有例子吗?
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      那就打电话给refresh-path吧。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • refreshenv 对我不起作用(Windows 10)。我仍然需要打开一个新窗口才能使其生效。
        • 我在 Windows 10 上测试并使用它,它经常对我有用。我制作的使用示例没有准备好,它是从我的控制台打印的。也许在您的情况下,用户变量和系统变量之间存在某种冲突?此外,正如我所注意到的,在多控制台环境(如 Conemu)中,它仅影响当前控制台。
        • refreshenv 也不在这里工作。在 Windows 沙盒环境中处理一些脚本,除非启动新的 PS 会话,否则路径会拒绝更新。
        【解决方案6】:

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

        $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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-05-25
          • 1970-01-01
          • 1970-01-01
          • 2023-03-20
          • 1970-01-01
          • 1970-01-01
          • 2018-06-18
          • 2012-04-25
          相关资源
          最近更新 更多