Как я могу получить переменные среды и, если чего-то не хватает, установить значение?





Используйте класс System.Environment.
Методы
var value = System.Environment.GetEnvironmentVariable(variable [, Target])
и
System.Environment.SetEnvironmentVariable(variable, value [, Target])
сделает всю работу за вас.
Необязательный параметр Target является перечислением типа EnvironmentVariableTarget и может принимать одно из следующих значений: Machine, Process или User. Если вы его опустите, целью по умолчанию будет текущий процесс..
EnvironmentVariableTarget.Machine требует доступа администратора?
Да, это так. Попытка запустить его без приведет к очевидному исключению.
Это будет работать для переменной среды, которая является настройкой компьютера. Для пользователей просто измените вместо этого на User.
String EnvironmentPath = System.Environment
.GetEnvironmentVariable("Variable_Name", 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);
Сработало для меня как шарм.
+1 Мне пришлось использовать это решение, потому что другое, на которое ответил Патрик Дежарден, требовало от меня прав администратора. Я смог прочитать значение переменной среды, не имея прав администратора с этим решением!
Ответ @TonoNam Патрика работает на моей машине с правами администратора без. Обратите внимание, что для настройки переменной среды System требуются права администратора (конечно).
Environment.SetEnvironmentVariable("Variable name", value, EnvironmentVariableTarget.User);
Если вы хотите, чтобы ваша переменная PATH была постоянной, используйте вместо нее EnvironmentVariableTarget.Machine.
Получить и установить
Получить
string getEnv = Environment.GetEnvironmentVariable("envVar");
Набор
string setEnv = Environment.SetEnvironmentVariable("envvar", varEnv);
Я мог бы обновить переменную среды, используя следующие
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 будет переопределено в значении переменной среды.
Также обратите внимание на необязательный третий параметр: System.Environment.SetEnvironmentVariable (переменная, значение, EnvironmentVariableTarget) Возможные значения: Машина, Процесс и Пользователь