vcpkg/scripts/cleanEnvironmentHelper.ps1
Ken A. Redergård b357d2d0c3 Fix issue with compiling vcpkg.exe (#4149) (#4213)
* Fix issue with compiling vcpkg.exe (#4149)

The check for environment variable PATH match
other environment variables. When environment variable
VCTargetsPath used by msbuild is changed in cleanEnvironmentHelper.ps1
 the path is broken. This makes the compilation of vcpkg.exe fail.

This commit fix the issue by checking that environment variable PATH is
exactly PATH.

* [cleanEnvironmentHelper] Use -eq instead of -match
2018-10-10 05:00:33 -07:00

53 lines
2.3 KiB
PowerShell

# 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 -eq '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')
}