添加新路径文件夹时如何在路径中维护环境变量

How to maintain environment variables in Path when adding new Path folder

我正在尝试通过执行以下操作将文件夹添加到我的“路径”环境变量中:

string path = Environment.GetEnvironmentVariable("Path", EnvironmentVariableTarget.Machine);
path = path + @";C:\my\new\path";
Environment.SetEnvironmentVariable("Path", path, EnvironmentVariableTarget.Machine);

这会成功地将我的新文件夹添加到 Path 变量中,但是,由环境变量表示的任何现有 Path 文件夹现在都已展开。

例如,我有一个指向 C:\Program Files\Java\jdk-17 的环境变量 JAVA_HOME,并且在 Path 变量中我最初有一个读取 %JAVA_HOME% 的条目\垃圾桶。但是,在进行上述更新后,现在 Path 条目显示为 C:\Program Files\Java\jdk-17\bin.

当我检查 Environment.GetEnvironmentVariable() 返回的字符串时,我发现它 returns 路径已经展开,而不是 %JAVA_HOME% 占位符。如何在不以扩展形式保存现有路径的情况下更新 Path 变量,而是保留其变量名称?

似乎 Environment.GetEnvironmentVariable 总是扩展嵌入在其他环境变量中的环境变量,并且没有选项可以更改此行为。

您可以尝试从注册表中读取环境变量,例如

using System;
using Microsoft.Win32;

class Program
{
    static void Main(string[] args)
    {
        var keyName = @"SYSTEM\CurrentControlSet\Control\Session Manager\Environment";
        var key = Registry.LocalMachine.OpenSubKey(keyName);
        var pathFromRegistry = key.GetValue("Path", "not found", RegistryValueOptions.DoNotExpandEnvironmentNames);
        Console.WriteLine(pathFromRegistry);
    }
}

我在 .net core 3.1 控制台应用程序中编写了这个示例,在可以使用 Microsoft.Win32 命名空间之前需要 Microsoft.Win32.Registry nuget 包。

有一个 GitHub issue 讨论了为什么 Environment.GetEnvironmentVariable 不提供相同的功能。