某些程序在安装时需要添加安装目录路径到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();