设置volatile变量

时间:2015-11-19 13:00:44

标签: c#

在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#中生成此行为?

2 个答案:

答案 0 :(得分:1)

.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需要的情况。

答案 1 :(得分:0)

根据我的评论和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);
    }
}