用百分号包裹的变量不能作为环境变量

用百分号包裹的变量不能作为环境变量

如您所见,我为 java 和 maven 定义了 JAVA_HOME 和 M2_HOME,并将其添加到路径环境变量中: 在此处输入图片描述

当我尝试执行 java 或 mvn 命令时,它们在 Windows 终端中的 powershell 中运行良好。

Windows 终端和 powershell 中的 mvn: 在此处输入图片描述

但如果我打开一个新的 powershell 或 cmd 则不起作用 在此处输入图片描述

知道为什么它们在 Windows 终端中工作而不是在独立的 powershell 中工作吗?如果变量没有被 % % 包裹,那么就没有问题,工作正常。例如,在第一个屏幕截图中,nvm 在 Windows 终端和 powershell 中都运行良好。

答案1

看起来你找到了解决方案,但发生这种情况的原因如下:

您设置JAVA_HOMEM2_HOME变量用户环境,但将它们添加到您的系统环境 PATH。在这种情况下,您在设置环境变量时遇到了竞争条件问题。在 Windows 中,根据SS64

当启动新进程时,变量将按以下顺序加载:

  • 系统环境变量
  • Shell 变量(每个用户)
  • 用户环境变量
  • Shell 变量(其他)

因此你通常无法设置用户里面的环境变量系统并让它们正确扩展。看起来新的 Windows 终端可能会以相反的顺序运行或以不同的方式处理 PATH 扩展,但这并不能保证其他进程也会如此。

以下是需要注意的事项:

# Powershell (core 7.2) terminal:
PS C:\Users\username> $env:path
C:\Program Files\PowerShell\7;%JAVA_HOME%;
                            # ^Bad, not expanded

# Windows Terminal, running Powershell 7.2:
PS C:\Users\username> $env:path
C:\Program Files\PowerShell\7;C:\Program Files\JavaFolder\jre\bin;
                            # ^Good

VS Code 将会以任意一种方式运行,具体取决于您使用的终端类型。


如果将它们全部设置在相同的环境中,则可以正常工作,因此可以:

  1. 添加JAVA_HOME/M2_HOME到您的用户PATH 并从中删除系统PATH,或
  2. 设置JAVA_HOMEM2_HOME系统变量。(看起来这对你有用)

相关内容