添加新路径文件夹时如何在路径中维护环境变量
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
不提供相同的功能。
我正在尝试通过执行以下操作将文件夹添加到我的“路径”环境变量中:
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
不提供相同的功能。