设置易失性环境变量

本文关键字:环境变量 易失性 设置 | 更新日期: 2023-09-27 18:22:31

在vbscript中,可以将环境变量设置为volatile。它将仅在登录会话期间持续存在。

Set colVolEnvVars = objWShell.Environment("VOLATILE")
colVolEnvVars(C_VOL_ENV_VAR_VALUE) = value

这些环境变量存储在:HKEY_CURRENT_USER''Volatile environment 中

在c#中,您可以使用设置环境变量

 Environment.SetEnvironmentVariable(envVar, value, EnvironmentVariableTarget);

EnvironmentVariableTarget枚举设置环境变量的类型。然而,它没有volatile的值。

我可以使用GetEnvironmentVariable读取c#中的易失性环境变量,但我不能设置一个。

我知道我可以创建一个用户环境变量,然后在使用后将其删除。或者我可以从c#运行一个vbscript文件来获得所需的结果。我希望c#足够强大,有一个更优雅的解决方案。

我如何在c#中产生这种行为?

设置易失性环境变量

.NET中没有API来设置易失性环境变量。

也就是说,实际Environment.SetEnvironmentVariable的实现实际上非常简单(来自.NET参考源):

using (RegistryKey environmentKey = 
       Registry.CurrentUser.OpenSubKey("Environment", true)) {
           if (environmentKey != null) {
               if (value == null)
                   environmentKey.DeleteValue(variable, false);
                      else
                   environmentKey.SetValue(variable, value);
               }
           }

您可以很容易地将其调整为使用Volatile environment密钥而不是Environment

可移植性也不是问题,因为其他.NET平台一开始就不支持全局环境变量(只支持EnvironmentVariableTarget.Process)。也许这样对你更好?除非提升,否则环境变量会由您启动的进程(及其子进程)继承——很少有Volatile environment是可取的。

根据我的评论和Luaan的回答;我使用Registry类创建了一个set volatile环境变量函数。

void CreateVolatileEnvironmentVariable(string envVar, string value)
{
    RegistryKey rkeyVolatileEnv;
    rkeyVolatileEnv = Registry.CurrentUser.OpenSubKey("Volatile Environment", true);
    if (rkeyVolatileEnv != null)
    {
        rkeyVolatileEnv.SetValue(envVar, value);
    }
}