.NET Core程序中,如何获取和设置操作系统环境变量的值
有时候我们在.NET Core程序中需要获取和设置操作系统环境变量的值。本文演示如何使用Environment.GetEnvironmentVariable和Environment.SetEnvironmentVariable方法,来获取和设置操作系统环境变量的值。
首先我们使用Windows命令行cmd,在Windows系统中创建一个环境变量myEnvironmentValue,注意要以管理员身份运行cmd(Run as administrator),cmd命令如下:
setx myEnvironmentValue "MyValue" /M
该命令在Windows系统中创建一个环境变量myEnvironmentValue,并设置其值为"MyValue",注意参数/M指定我们设置的是系统环境变量(不是用户环境变量),详情可以查看这里。
命令运行后显示"SUCCESS"就说明成功了:

现在我们查看Windows系统的环境变量,可以发现我们刚才通过命令行创建的环境变量myEnvironmentValue如下所示:

接下来我们新建一个.NET Core控制台项目,其代码如下所示,注意这段代码要求以管理员身份运行(Run as administrator)Visual Studio:
using System; namespace NetCoreEnvironmentVariable
{
class Program
{
static void Main(string[] args)
{
string myEnvironmentValue = Environment.GetEnvironmentVariable("myEnvironmentValue", EnvironmentVariableTarget.Machine);//获取操作系统环境变量myEnvironmentValue的值,如果操作系统不存在环境变量myEnvironmentValue,则Environment.GetEnvironmentVariable方法会返回null,注意参数EnvironmentVariableTarget.Machine指定了我们获取的是系统环境变量(不是用户环境变量),注意Environment.GetEnvironmentVariable方法并不需要我们的.NET Core程序要以管理员身份运行(Run as administrator),就能成功取出系统环境变量的值
Console.WriteLine($"myEnvironmentValue:" + myEnvironmentValue); myEnvironmentValue = "UpdatedValue";//环境变量myEnvironmentValue的新值
Environment.SetEnvironmentVariable("myEnvironmentValue", myEnvironmentValue, EnvironmentVariableTarget.Machine);//设置操作系统环境变量myEnvironmentValue的值,如果操作系统不存在环境变量myEnvironmentValue,那么Environment.SetEnvironmentVariable方法会在操作系统中创建一个名为myEnvironmentValue的环境变量,注意参数EnvironmentVariableTarget.Machine指定了我们设置的是系统环境变量(不是用户环境变量),而这要求我们的.NET Core程序要以管理员身份运行(Run as administrator),否则Environment.SetEnvironmentVariable方法会抛出异常 myEnvironmentValue = Environment.GetEnvironmentVariable("myEnvironmentValue", EnvironmentVariableTarget.Machine);//再次获取操作系统环境变量myEnvironmentValue的值
Console.WriteLine($"myEnvironmentValue:" + myEnvironmentValue); Console.WriteLine("Press key to end...");
Console.ReadKey();
}
}
}
其中需要注意Environment.GetEnvironmentVariable和Environment.SetEnvironmentVariable方法的EnvironmentVariableTarget参数,用于指定我们获取和设置的是Windows操作系统的系统环境变量,EnvironmentVariableTarget是一个枚举类型,其所有值解释如下:
| 字段 | ||
| Machine | 2 | 在 Windows 操作系统注册表的 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment 项中存储或从其中检索环境变量。 此值应仅用于在 Windows 系统上运行的 .NET 实现。 |
| Process | 0 | 环境变量存储在与当前进程关联的环境块中,或者从其中检索。 |
| User | 1 | 在 Windows 操作系统注册表的 HKEY_CURRENT_USER\Environment 项中存储或从其中检索环境变量。 此值应仅用于在 Windows 系统上运行的 .NET 实现。 |
可以看到EnvironmentVariableTarget枚举的值Machine和User,仅对Windows操作系统有效,对Linux操作系统不起作用。
上面代码运行的结果如下所示:

然后我们再次查看Windows系统的环境变量,可以发现环境变量myEnvironmentValue的值变为"UpdatedValue"了:

经测试在ASP.NET Core中,也可以用Environment.GetEnvironmentVariable方法来获取Windows操作系统中系统环境变量和用户环境变量的值。
关于EnvironmentVariableTarget.Process参数
在Linux操作系统中,Environment.GetEnvironmentVariable和Environment.SetEnvironmentVariable方法都只对EnvironmentVariableTarget.Process参数有效。当Environment.GetEnvironmentVariable方法使用EnvironmentVariableTarget.Process参数获取环境变量的时候,实际上读取的是当前.NET Core程序进程中的环境变量,而.NET Core程序进程中的环境变量又可以来自于操作系统的环境变量,这个过程可以理解为:
- 在操作系统中,添加一个名为myEnvironmentValue的系统环境变量
- .NET Core程序将操作系统中的环境变量myEnvironmentValue读取到.NET Core程序进程中
- 使用EnvironmentVariableTarget.Process参数的Environment.GetEnvironmentVariable方法,从.NET Core程序进程中读取到环境变量myEnvironmentValue的值
而这个过程的第2步,实际上是有延迟的,所以当你在操作系统中添加了一个环境变量后,发现使用EnvironmentVariableTarget.Process参数的Environment.GetEnvironmentVariable方法,读取不到该环境变量,请重启计算机后再尝试读取,重启计算机会使得.NET Core程序进程读取操作系统中的环境变量,所以在使用EnvironmentVariableTarget.Process参数时,要注意有延迟的问题。
.NET Core程序中,如何获取和设置操作系统环境变量的值的更多相关文章
- java 中利用反射机制获取和设置实体类的属性值
摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...
- 在应用程序中实现对NandFlash的操作
以TC58NVG2S3ETA00 为例: 下面是它的一些物理参数: 图一 图二 图三 图四 图五 图6-0 图6-1 说明一下,在图6-1中中间的那个布局表可以看做是实际的NandFlash一页数据的 ...
- java反射获取和设置实体类的属性值 递归所有父类
最近做一个通用数据操作接口,需要动态获取和设置实体类的属性值,为了通用实体做了多重继承,开始网上找到代码都不支持父类操作,只能自己搞一个工具类了,此工具类可以设置和获取所有父类属性,代码贴下面拿走不谢 ...
- Springboot yml获取系统环境变量的值
注意,这里说的是获取系统环境变量的值,譬如Windows里配置的JAVA_HOME之类的,可以直接在Springboot的配置文件中获取. 我们经常使用一些docker管理平台,如DaoCloud.r ...
- Springboot配置文件获取系统环境变量的值
注意,这里说的是获取系统环境变量的值,譬如Windows里配置的JAVA_HOME之类的,可以直接在Springboot的配置文件中获取. 我们经常使用一些docker管理平台,如DaoCloud.r ...
- python中如何调用函数交换两个变量的值
python中如何调用函数交换两个变量的值 所有代码来在python3.7.1版本实现 以下实例通过用户输入两个变量,并相互交换: 方法一: def swap(a,b): # 创建临时变量,并交换 ...
- .NET Core程序中使用User Secrets存储敏感数据
前言 在开发中经常会用到一些敏感数据,比如AppSecret或数据库连接字符串,无论是硬编码还是写在配置文件中,最终都要push到svn或git上.对于开源项目,这些敏感数据就无隐私可言了,对于私有项 ...
- .net core程序中使用微软的依赖注入框架
我之前在博文中介绍过Asp.net core下系统自带的依赖注入框架,这个依赖框架在Microsoft.Extensions.DependencyInjection中实现,本身并不是.net core ...
- 在.net core程序中使用EntityFrameok(非EF Core)
最近用NoSQL较多写,用传统的EF到不多,但在一些.net core小程序中也小试牛刀过,不过当时用的是微软为.net core量身定制的Entity Framework Core,只是一些比较常规 ...
随机推荐
- ant笔记
目录 ant远程部署 ant的使用,命令! 参考文献: ant+maven一键打包springboot上传服务器发布 判断linux文件.文件夹是否存在 shell中脚本参数传递的两种方式 shell ...
- Android 获取联系人的号码的类型描述
...... int index = phonesCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); int t ...
- 重新学习Spring注解——ICO
02.组件注册-@Configuration&@Bean给容器中注册组件 03.组件注册-@ComponentScan-自动扫描组件&指定扫描规则 04.组件注册-自定义TypeFil ...
- Ubuntu18.04安装redis-server启动出错
虽然报错原因可能是 redis-server.service: Can't open PID file /var/run/redis/re Aug 26 15:43:25 iZ2ze6ddwhet60 ...
- SpreadJS 生成报表
空了再写个完整的demo吧 //报表控件 输入参数待定 function SpreadObj(response) { var spread = null; //数据列表 var dataArray = ...
- 【border树】【P2375】动物园
Description 给定一个字符串 \(S\),对每个前缀求长度不超过该前缀一半的公共前后缀个数. 共有 \(T\) 组数据,每组数据的输出是 \(O(1)\) 的. Limitations \( ...
- Python、Spyder的环境搭建
有什么不对欢迎大家指出,一起交流啊,只针对Windows!!!!(苹果买不起...)Python安装的话2.7版本和3.6版本都可以,虽然2.7比较全面,但还是建议安装3.6,这里以3.6为例进行介绍 ...
- 触发bfc解决父子元素嵌套垂直方向margin塌陷问题
首先看一下问题案例 .wrapper{ width: 100px; height: 100px; background-colo ...
- UID、PID、PPID是什么?
UID是用户ID,PID是进程ID,PPID是父进程ID. UID UID 用户身份证明(User Identification)的缩写.UID用户在注册后,系统会自动的给你一个UID的数值.意思就是 ...
- iptables 数据走向流程
链的规则存放于哪些表中(从链到表的对应关系): PREROUTING 的规则可以存在于:raw表,mangle表,nat表. INPUT 的规则可以存在于:mangle表,filter表,(cento ...