有时候我们在.NET Core程序中需要获取和设置操作系统环境变量的值。本文演示如何使用Environment.GetEnvironmentVariableEnvironment.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程序进程中的环境变量又可以来自于操作系统的环境变量,这个过程可以理解为:

  1. 在操作系统中,添加一个名为myEnvironmentValue的系统环境变量
  2. .NET Core程序将操作系统中的环境变量myEnvironmentValue读取到.NET Core程序进程中
  3. 使用EnvironmentVariableTarget.Process参数的Environment.GetEnvironmentVariable方法,从.NET Core程序进程中读取到环境变量myEnvironmentValue的值

而这个过程的第2步,实际上是有延迟的,所以当你在操作系统中添加了一个环境变量后,发现使用EnvironmentVariableTarget.Process参数的Environment.GetEnvironmentVariable方法,读取不到该环境变量,请重启计算机后再尝试读取,重启计算机会使得.NET Core程序进程读取操作系统中的环境变量,所以在使用EnvironmentVariableTarget.Process参数时,要注意有延迟的问题。

.NET Core程序中,如何获取和设置操作系统环境变量的值的更多相关文章

  1. java 中利用反射机制获取和设置实体类的属性值

    摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...

  2. 在应用程序中实现对NandFlash的操作

    以TC58NVG2S3ETA00 为例: 下面是它的一些物理参数: 图一 图二 图三 图四 图五 图6-0 图6-1 说明一下,在图6-1中中间的那个布局表可以看做是实际的NandFlash一页数据的 ...

  3. java反射获取和设置实体类的属性值 递归所有父类

    最近做一个通用数据操作接口,需要动态获取和设置实体类的属性值,为了通用实体做了多重继承,开始网上找到代码都不支持父类操作,只能自己搞一个工具类了,此工具类可以设置和获取所有父类属性,代码贴下面拿走不谢 ...

  4. Springboot yml获取系统环境变量的值

    注意,这里说的是获取系统环境变量的值,譬如Windows里配置的JAVA_HOME之类的,可以直接在Springboot的配置文件中获取. 我们经常使用一些docker管理平台,如DaoCloud.r ...

  5. Springboot配置文件获取系统环境变量的值

    注意,这里说的是获取系统环境变量的值,譬如Windows里配置的JAVA_HOME之类的,可以直接在Springboot的配置文件中获取. 我们经常使用一些docker管理平台,如DaoCloud.r ...

  6. python中如何调用函数交换两个变量的值

    python中如何调用函数交换两个变量的值 所有代码来在python3.7.1版本实现 以下实例通过用户输入两个变量,并相互交换:  方法一: def swap(a,b): # 创建临时变量,并交换 ...

  7. .NET Core程序中使用User Secrets存储敏感数据

    前言 在开发中经常会用到一些敏感数据,比如AppSecret或数据库连接字符串,无论是硬编码还是写在配置文件中,最终都要push到svn或git上.对于开源项目,这些敏感数据就无隐私可言了,对于私有项 ...

  8. .net core程序中使用微软的依赖注入框架

    我之前在博文中介绍过Asp.net core下系统自带的依赖注入框架,这个依赖框架在Microsoft.Extensions.DependencyInjection中实现,本身并不是.net core ...

  9. 在.net core程序中使用EntityFrameok(非EF Core)

    最近用NoSQL较多写,用传统的EF到不多,但在一些.net core小程序中也小试牛刀过,不过当时用的是微软为.net core量身定制的Entity Framework Core,只是一些比较常规 ...

随机推荐

  1. PAT 乙级 1042.字符统计 C++/Java

    题目来源 请编写程序,找出一段给定文字中出现最频繁的那个英文字母. 输入格式: 输入在一行中给出一个长度不超过 1000 的字符串.字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个 ...

  2. tf.Variable()、tf.get_variable()和tf.placeholder()

    1.tf.Variable() tf.Variable(initializer,name) 功能:tf.Variable()创建变量时,name属性值允许重复,检查到相同名字的变量时,由自动别名机制创 ...

  3. seq2seq模型详解及对比(CNN,RNN,Transformer)

    一,概述 在自然语言生成的任务中,大部分是基于seq2seq模型实现的(除此之外,还有语言模型,GAN等也能做文本生成),例如生成式对话,机器翻译,文本摘要等等,seq2seq模型是由encoder, ...

  4. 爱奇艺 登录 加密字段 passwd 破解

    这是一个rsa加密,并且每次加密候的数据固定不变. 第一步:查看加密字段 第二步:搜索加密参数 第三步:打断点调试 1 2 3. 第四部:js调试工具调试 第五步:源码 function c(a) { ...

  5. @TableField

    @TableField 描述:字段注解(非主键) 属性 类型 必须指定 默认值 描述 value String 否 "" 字段名 el String 否 "" ...

  6. 补充:垃圾回收机制、线程池和ORM缺点

    补充:垃圾回收机制.线程池和ORM缺点 垃圾回收机制不仅有引用计数,还有标记清除和分代回收 引用计数就是内存地址的门牌号,为0时就会回收掉,但是会出现循环引用问题,这种情况下会导致内存泄漏(即不会被用 ...

  7. IIS 加载字体

    原文:https://blog.csdn.net/prospertu/article/details/72852500 <system.webServer> <staticConte ...

  8. NOIP动态规划大合集

    1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...

  9. dockerfile+docker-compose

    Dockerfile 一.简介 1.1 dockerfile中常用的命令合集 1.2 docker build 基于dockerfile制作镜像的命令 docker build [OPTIONS] P ...

  10. Affy包 estrogen包

    下载安装 if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocMana ...