C#添加Windows环境变量

文章介绍了两种使用C#修改系统PATH环境变量的方法,以确保程序如Python、Node的可执行文件能被找到。第一种方法使用System.Environment类,但可能无法保留%SystemRoot%这样的系统变量。第二种方法通过操作注册表实现,可以避免值的重复并保留系统变量。优化后的代码确保了添加路径时不重复且不会将%SystemRoot%替换为实际路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

某些程序在安装时需要添加安装目录路径到PATH环境变量中才能使用,比如Python、Node等程序,C#要使用这些程序就需要在程序中安装和配置这些程序,首先就是通过C#代码来添加PATH.

方法一

通过System.Environment就可以读取写入环境变量

// 读取系统环境变量Path值(%SystemRoot%会自动转换为真实的C:\Windows)
string pathStr = System.Environment.GetEnvironmentVariable("Path", EnvironmentVariableTarget.Machine);
// 修改系统环境变量Path值
System.Environment.SetEnvironmentVariable("Path", pathStr+";添加新值", EnvironmentVariableTarget.Machine);

但是以上代码会%SystemRoot%会自动转换为真实的C:\Windows,当我们修改时想保留%SystemRoot%系统变量而不是实际值,另外添加新值时还需要避免重复值等,所以需要进一步优化

using

using System;
using Microsoft.Win32; // 操作注册表
using System.Collections; // arraylist

优化后代码

RegistryKey key = Registry.LocalMachine;
RegistryKey env = key.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Session Manager\Environment", true); //该项必须已存在
// 从注册表读取系统环境变量Path值(%SystemRoot%系统变量不会被替换为C:\Windows)
string pathStr = (string)env.GetValue("PATH", "", RegistryValueOptions.DoNotExpandEnvironmentNames);
// 读取系统环境变量Path值(%SystemRoot%会自动转换为真实的C:\Windows)
// string pathStr = System.Environment.GetEnvironmentVariable("Path", EnvironmentVariableTarget.Machine);

// 字符串转string[]再转ArrayList方便添加路径
string[] pathArray = pathStr.Split(';');
ArrayList pathList = new ArrayList(pathArray);
if (!pathList.Contains("新值")) {
	pathList.Add("新值"); // 检查不存在则添加
}

// ArrayList转换string[]再连接成字符串
pathArray = (string[])pathList.ToArray(typeof(string));
pathStr = string.Join(";", pathArray);
// 修改环境变量Path值
Environment.SetEnvironmentVariable("Path", pathStr, EnvironmentVariableTarget.Machine);

方法二

通过注册表修改环境变量,但是缺点是修改后变量不能立即生效。

简单示例

// 如果该键值原本已经存在,则会修改替换原来的键值,如果不存在则是创建该键值。
// 注意:SetValue()还有第三个参数,主要是用于设置键值的类型,如:字符串,二进制,Dword等等~~默认是字符串。如:
// env.SetValue("test", "0", RegistryValueKind.DWord); //二进制信息
RegistryKey key = Registry.LocalMachine;
RegistryKey env = key.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Session Manager\Environment", true); //该项必须已存在
string pathStr = env.GetValue("Path").ToString(); // 从注册表读取系统环境变量Path值(%SystemRoot%会自动转换为真实的C:\Windows)
env.SetValue("Path", pathStr+";添加新值"); // 修改环境变量Path值
key.Close(); // 关闭注册表

优化后代码,避免添加重复值,保留%SystemRoot%等系统变量:

// 如果该键值原本已经存在,则会修改替换原来的键值,如果不存在则是创建该键值。
// 注意:SetValue()还有第三个参数,主要是用于设置键值的类型,如:字符串,二进制,Dword等等~~默认是字符串。如:
// env.SetValue("test", "0", RegistryValueKind.DWord); //二进制信息
RegistryKey key = Registry.LocalMachine;
RegistryKey env = key.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Session Manager\Environment", true); //该项必须已存在

// 从注册表读取系统环境变量Path值(%SystemRoot%会自动转换为真实的C:\Windows)
// string pathStr = env.GetValue("Path").ToString();
// 从注册表读取系统环境变量Path值(%SystemRoot%系统变量不会被替换为C:\Windows)
string pathStr = (string)env.GetValue("PATH", "", RegistryValueOptions.DoNotExpandEnvironmentNames);

// 字符串转string[]再转ArrayList方便添加路径
string[] pathArray = pathStr.Split(';');
ArrayList pathList = new ArrayList(pathArray);
if (!pathList.Contains("新值")) {
	pathList.Add("新值"); // 检查不存在则添加
}

// ArrayList转换string[]再连接成字符串
pathArray = (string[])pathList.ToArray(typeof(string));
pathStr = string.Join(";", pathArray);
// 修改环境变量Path值
env.SetValue("Path", pathStr);
// 关闭注册表
key.Close();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值