aboutsummaryrefslogtreecommitdiff
path: root/scripts/cleanEnvironmentHelper.ps1
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/cleanEnvironmentHelper.ps1')
-rw-r--r--scripts/cleanEnvironmentHelper.ps152
1 files changed, 52 insertions, 0 deletions
diff --git a/scripts/cleanEnvironmentHelper.ps1 b/scripts/cleanEnvironmentHelper.ps1
new file mode 100644
index 000000000..0a133f5f8
--- /dev/null
+++ b/scripts/cleanEnvironmentHelper.ps1
@@ -0,0 +1,52 @@
+# Capture environment variables for the System and User. Also add some special/built-in variables.
+# These will be used to synthesize a clean environment
+$specialEnvironmentMap = @{ "SystemDrive"=$env:SystemDrive; "SystemRoot"=$env:SystemRoot; "UserProfile"=$env:UserProfile } # These are built-in and not set in the registry
+$machineEnvironmentMap = [Environment]::GetEnvironmentVariables('Machine') # HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
+$userEnvironmentMap = [Environment]::GetEnvironmentVariables('User') # HKEY_CURRENT_USER\Environment
+
+# Identify the keySet of environment variable names
+$nameSet = ($specialEnvironmentMap.Keys + $machineEnvironmentMap.Keys + $userEnvironmentMap.Keys) | Sort-Object | Select-Object -Unique
+
+# Any environment variable in the $nameSet should be restored to its original value
+foreach ($name in $nameSet)
+{
+ if ($specialEnvironmentMap.ContainsKey($name))
+ {
+ [Environment]::SetEnvironmentVariable($name, $specialEnvironmentMap[$name], 'Process')
+ continue;
+ }
+
+ # PATH needs to be concatenated as it has values in both machine and user environment. Any other values should be set.
+ if ($name -match 'path')
+ {
+ $pathValuePartial = @()
+ # Machine values before user values
+ $pathValuePartial += $machineEnvironmentMap[$name] -split ';'
+ $pathValuePartial += $userEnvironmentMap[$name] -split ';'
+ $pathValue = $pathValuePartial -join ';'
+ [Environment]::SetEnvironmentVariable($name, $pathValue, 'Process')
+ continue;
+ }
+
+ if ($userEnvironmentMap.ContainsKey($name))
+ {
+ [Environment]::SetEnvironmentVariable($name, $userEnvironmentMap[$name], 'Process')
+ continue;
+ }
+
+ if ($machineEnvironmentMap.ContainsKey($name))
+ {
+ [Environment]::SetEnvironmentVariable($name, $machineEnvironmentMap[$name], 'Process')
+ continue;
+ }
+
+ throw "Unreachable: Unknown variable $name"
+}
+
+# Any environment variable NOT in the $nameSet should be removed
+$processEnvironmentMap = [Environment]::GetEnvironmentVariables('Process')
+$variablesForRemoval = $processEnvironmentMap.Keys | Where-Object {$nameSet -notcontains $_}
+foreach ($name in $variablesForRemoval)
+{
+ [Environment]::SetEnvironmentVariable($name, $null, 'Process')
+}