PATHvariables的GetEnvironmentVariable()和SetEnvironmentVariable()

我想用C#程序来扩展当前的PATHvariables。 在这里我有几个问题:

  1. 使用GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Machine)replace占位符(即'%SystemRoot%\system32'被replace为当前path'C:\Windows\system32' )。 更新PATHvariables,我不想用pathreplace占位符。

  2. SetEnvironmentVariable后,不能再从命令框中打开程序(即命令框中的calc.exe不起作用)。 我使用下面的代码:

 String oldPath = Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Machine); Environment.SetEnvironmentVariable("PATH", oldPath + ";%MYDIR%", EnvironmentVariableTarget.Machine); 

在Windows中编辑和更改PATHvariables后,所有工作都会重新开始。 (我需要更改,否则不会被覆盖)

Solutions Collecting From Web of "PATHvariables的GetEnvironmentVariable()和SetEnvironmentVariable()"

您可以使用注册表来读取和更新:

 string keyName = @"SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; //get non-expanded PATH environment variable string oldPath = (string)Registry.LocalMachine.CreateSubKey(keyName).GetValue("Path", "", RegistryValueOptions.DoNotExpandEnvironmentNames); //set the path as an an expandable string Registry.LocalMachine.CreateSubKey(keyName).SetValue("Path", oldPath + ";%MYDIR%", RegistryValueKind.ExpandString); 

您可以使用WMI来检索原始值(不确定有关更新它们):

 ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_Environment WHERE Name = 'PATH'"); foreach (ManagementBaseObject managementBaseObject in searcher.Get()) Console.WriteLine(managementBaseObject["VariableValue"]); 

检查MSDN上的WMI参考

你可以尝试这种混合。 它从注册表中获取路径变量,并将“NewPathEntry”添加到路径(如果尚未存在的话)。

 static void Main(string[] args) { string NewPathEntry = @"%temp%\data"; string NewPath = ""; bool MustUpdate = true; string RegKeyName = @"SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; string path = (string)Microsoft.Win32.Registry.LocalMachine.OpenSubKey(RegKeyName).GetValue ("Path", "", Microsoft.Win32.RegistryValueOptions.DoNotExpandEnvironmentNames); string[] paths = path.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); foreach (string subPath in paths) { NewPath += subPath + ";"; if (subPath.ToLower() == NewPathEntry.ToLower()) { MustUpdate = false; } } if (MustUpdate == true) { Environment.SetEnvironmentVariable("Path", NewPath + NewPathEntry, EnvironmentVariableTarget.Machine); } } 

你可以通过注册表…

 string keyName = @"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; //get raw PATH environment variable string path = (string)Registry.GetValue(keyName, "Path", ""); //... Make some changes //update raw PATH environment variable Registry.SetValue(keyName, "Path", path); 

在应用程序上工作时,我们必须有一个选项来使用来自用户定义文件夹的Oracle instantclient。 为了使用instantclient,我们必须修改环境路径变量并调用任何与Oracle相关的功能之前添加这个文件夹。 这里是我们使用的方法:

  /// <summary> /// Adds an environment path segments (the PATH varialbe). /// </summary> /// <param name="pathSegment">The path segment.</param> public static void AddPathSegments(string pathSegment) { LogHelper.Log(LogType.Dbg, "EnvironmentHelper.AddPathSegments", "Adding path segment: {0}", pathSegment); string allPaths = Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Process); if (allPaths != null) allPaths = pathSegment + "; " + allPaths; else allPaths = pathSegment; Environment.SetEnvironmentVariable("PATH", allPaths, EnvironmentVariableTarget.Process); } 

请注意,这必须在其他任何事情之前调用,可能作为您的主文件中的第一行(不知道控制台应用程序)。

使用Registry.GetValue将扩大占位符,所以我建议使用Registry.LocalMachine.OpenSubKey ,然后从设置为不扩展环境变量的选项设置的子键中获取值。 一旦你操纵了你喜欢的路径,使用注册表再次设置值。 这将防止Windows“忘记”你的问题的第二部分中提到的路径。

 const string pathKeyName = @"SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; var pathKey = Registry.LocalMachine.OpenSubKey(pathKeyName); var path = (string)pathKey.GetValue("PATH", "", RegistryValueOptions.DoNotExpandEnvironmentNames); // Manipulate path here, storing in path Registry.SetValue(String.Concat(@"HKEY_LOCAL_MACHINE\", pathKeyName), "PATH", path);