diff --git a/PowerKit/Extensions/EnvironmentExtensions.cs b/PowerKit/Extensions/EnvironmentExtensions.cs new file mode 100644 index 0000000..d92c769 --- /dev/null +++ b/PowerKit/Extensions/EnvironmentExtensions.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections; + +namespace PowerKit.Extensions; + +internal static class EnvironmentExtensions +{ + extension(Environment) + { + /// + /// Refreshes the environment variables of the current process by re-applying + /// the machine-level and user-level environment variables. + /// + /// + /// On Windows, this first removes any process-level environment variables that + /// are not present at the machine or user scope, then applies the machine-level + /// and user-level values to the current process. + /// This can remove variables inherited from the parent process or set by the + /// application itself. + /// On other platforms, this method is a no-op. + /// + public static void RefreshEnvironmentVariables() + { + if (!OperatingSystem.IsWindows()) + { + return; + } + + var machineVariables = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Machine); + var userVariables = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.User); + + // Remove missing + foreach (DictionaryEntry environmentVariable in Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Process)) + { + var key = (string)environmentVariable.Key; + + if (!machineVariables.Contains(key) && !userVariables.Contains(key)) + { + Environment.SetEnvironmentVariable(key, null, EnvironmentVariableTarget.Process); + } + } + + // Add/set machine variables + foreach (DictionaryEntry environmentVariable in machineVariables) + { + var key = (string)environmentVariable.Key; + var value = (string?)environmentVariable.Value; + + Environment.SetEnvironmentVariable(key, value, EnvironmentVariableTarget.Process); + } + + // Add/set user variables + foreach (DictionaryEntry environmentVariable in userVariables) + { + var key = (string)environmentVariable.Key; + var value = (string?)environmentVariable.Value; + + Environment.SetEnvironmentVariable(key, value, EnvironmentVariableTarget.Process); + } + } + } +}