【发布时间】:2010-09-16 03:49:29
【问题描述】:
如何获取环境变量,如果缺少某些内容,请设置值?
【问题讨论】:
标签: c# .net .net-2.0 environment-variables
如何获取环境变量,如果缺少某些内容,请设置值?
【问题讨论】:
标签: c# .net .net-2.0 environment-variables
使用System.Environment 类。
方法
var value = System.Environment.GetEnvironmentVariable(variable [, Target])
和
System.Environment.SetEnvironmentVariable(variable, value [, Target])
将为您完成这项工作。
可选参数Target 是EnvironmentVariableTarget 类型的枚举,它可以是以下之一:Machine、Process 或User。如果省略它,则默认目标是当前进程。
【讨论】:
EnvironmentVariableTarget.Machine 是否需要管理员权限?
我在使用 .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);
对我来说就像一个魅力。
【讨论】:
获取和设置
获取
string getEnv = Environment.GetEnvironmentVariable("envVar");
设置
string setEnv = Environment.SetEnvironmentVariable("envvar", varEnv);
【讨论】:
这适用于作为机器设置的环境变量。对于用户,只需更改为用户即可。
String EnvironmentPath = System.Environment
.GetEnvironmentVariable("Variable_Name", EnvironmentVariableTarget.Machine);
【讨论】:
Environment.SetEnvironmentVariable("Variable name", value, EnvironmentVariableTarget.User);
【讨论】:
EnvironmentVariableTarget.Machine。
在 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>
【讨论】:
我可以通过以下方式更新环境变量
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);
【讨论】:
如果读取环境变量的目的是覆盖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 将被环境变量值覆盖。
【讨论】:
环境变量也可以放在应用程序的app.config 或web.config 文件中,它们的名称以百分比为界 (%),然后在代码中展开。
例如在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);
【讨论】: