在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#中生成此行为?
答案 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);
}
}