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

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

【问题讨论】:

    标签: c# .net .net-2.0 environment-variables


    【解决方案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); 
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-03-25
              • 2011-11-27
              • 2010-09-23
              • 1970-01-01
              相关资源
              最近更新 更多