如何在 C# 中获取和设置环境变量?

Posted

技术标签:

【中文标题】如何在 C# 中获取和设置环境变量?【英文标题】:How do I get and set Environment variables in C#? 【发布时间】:2010-09-16 03:49:29 【问题描述】:

如何获取环境变量,如果缺少某些内容,请设置值?

【问题讨论】:

【参考方案1】:

使用System.Environment 类。

方法

var value = System.Environment.GetEnvironmentVariable(variable [, Target])

System.Environment.SetEnvironmentVariable(variable, value [, Target])

将为您完成这项工作。

可选参数TargetEnvironmentVariableTarget 类型的枚举,它可以是以下之一:MachineProcessUser。如果省略它,则默认目标是当前进程。

【讨论】:

还要注意可选的第三个参数:System.Environment.SetEnvironmentVariable(variable, value, EnvironmentVariableTarget) 可能的值是:Machine, 进程用户 EnvironmentVariableTarget.Machine 是否需要管理员权限? 是的,确实如此。尝试不运行它会导致明显的异常。【参考方案2】:

我在使用 .NET 控制台应用程序读取 PATH 环境变量时遇到了这个问题,发现使用 System.Environment.GetEnvironmentVariable 会自动扩展环境变量。

我不希望这种情况发生...这意味着路径中的文件夹(例如 '%SystemRoot%\system32')被重写为 'C:\Windows\system32'。为了获得未扩展的路径,我不得不使用这个:

string keyName = @"SYSTEM\CurrentControlSet\Control\Session Manager\Environment\";
string existingPathFolderVariable = (string)Registry.LocalMachine.OpenSubKey(keyName).GetValue("PATH", "", RegistryValueOptions.DoNotExpandEnvironmentNames);

对我来说就像一个魅力。

【讨论】:

+1 我不得不使用这个解决方案,因为 Patrick Desjardins 回答的另一个问题要求我拥有管理员权限。使用此解决方案,我无需管理员权限即可读取环境变量的值! @TonoNam Patrick 的回答在我的机器上工作,没有管理员权限。请注意,设置系统环境变量确实需要管理员权限(当然)。【参考方案3】:

获取和设置

获取

string getEnv = Environment.GetEnvironmentVariable("envVar");

设置

string setEnv = Environment.SetEnvironmentVariable("envvar", varEnv);

【讨论】:

【参考方案4】:

这适用于作为机器设置的环境变量。对于用户,只需更改为用户即可。

String EnvironmentPath = System.Environment
                .GetEnvironmentVariable("Variable_Name", EnvironmentVariableTarget.Machine);

【讨论】:

【参考方案5】:
Environment.SetEnvironmentVariable("Variable name", value, EnvironmentVariableTarget.User);

【讨论】:

如果您希望您的 PATH 变量永久使用 EnvironmentVariableTarget.Machine【参考方案6】:

在 Visual Studio 2019 中——右键单击您的项目,选择“属性”>“设置”,通过为其命名(如 ConnectionString)、类型和值来添加新变量。然后在你的代码中这样读:

var sConnectionStr = Properties.Settings.Default.ConnectionString;

这些变量将根据您的项目类型存储在配置文件(web.config 或 app.config)中。以下是它的外观示例:

  <applicationSettings>
    <Testing.Properties.Settings>
      <setting name="ConnectionString" serializeAs="String">
        <value>data source=blah-blah;etc-etc</value>
      </setting>
    </Testing.Properties.Settings>
  </applicationSettings>

【讨论】:

这错过了使用环境变量的优势——这个 sn-p “硬编码”配置文件中的连接字符串,而不是依赖于环境变量。【参考方案7】:

我可以通过以下方式更新环境变量

string EnvPath = System.Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Machine) ?? string.Empty;
if (!string.IsNullOrEmpty(EnvPath) && !EnvPath .EndsWith(";"))
    EnvPath = EnvPath + ';';
EnvPath = EnvPath + @"C:\Test";
Environment.SetEnvironmentVariable("PATH", EnvPath , EnvironmentVariableTarget.Machine);

【讨论】:

【参考方案8】:

如果读取环境变量的目的是覆盖appsetting.json或其他配置文件中的值,可以通过EnvironmentVariablesExtensions归档。

var builder = new ConfigurationBuilder()
                .AddJsonFile("appSettings.json")
                .AddEnvironmentVariables(prefix: "ABC_")

var config = builder.Build();

根据此示例,环境的 URL 是从 appsettings.json 中读取的。但是当 AddEnvironmentVariables(prefix: "ABC_") 行添加到 ConfigurationBuilder 时,值 appsettings.json 将被环境变量值覆盖。

【讨论】:

【参考方案9】:

环境变量也可以放在应用程序的app.configweb.config 文件中,它们的名称以百分比为界 (%),然后在代码中展开。

请注意,当环境变量的值发生更改(或设置新值)时,应关闭并重新打开 Visual Studio。

例如在app.config:

<connectionStrings>
    <add name="myConnectionString" connectionString="%DEV_SQL_SERVER_CONNECTION_STRING%" providerName="System.Data.SqlClient" />
</connectionStrings>

然后在代码中:

string connectionStringEnv = ConfigurationManager.AppSettings["myConnectionString"];
string connectionString = System.Environment.ExpandEnvironmentVariables(connectionStringEnv); 

【讨论】:

以上是关于如何在 C# 中获取和设置环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何从不同的会话中获取 Windows 环境变量的当前值

在Postman中如何设置环境变量?

如何将 PATH 环境变量替换为双引号 + 反斜杠那些在 C# 中有空格的变量?

如何在build.gradle中创建文件并设置环境变量并获取文件内的数据?

bat脚本如何获取环境变量字面值(请看问题说明再回答)?

kettle环境变量的设置和获取