Functions/Initialize-VSEnvironment.ps1

# Copyright (c) 2017, the WebKit for Windows project authors. Please see the
# AUTHORS file for details. All rights reserved. Use of this source code is
# governed by a BSD-style license that can be found in the LICENSE file.

<#
  .Synopsis
  Initializes the Visual Studio C++ environment.
 
  .Description
  Powershell wrapper for calling `vcvarsall.bat` and replicating the
  environment back to the powershell context.
 
  .Parameter Architecture
  The architecture to setup for. Either `x86` or `amd64`.
 
  .Parameter Path
  The path to `vcvarsall.bat`
 
  .Parameter Toolset
  The Visual Studio toolset to use. If unspecified the latest installed is
  used.
 
  .Example
    # Initialize VC++ 2019 environment.
    Initialize-VSEnvironment -Architecture amd64 -Path (Get-VSBuildTools2019VCVarsAllPath)
 
  .Example
    # Initialize VC++ 2017 environment.
    Initialize-VSEnvironment -Architecture amd64 -Path (Get-VSBuildTools2017VCVarsAllPath)
 
  .Example
    # Initialize VC++ 2015 environment.
    Initialize-VSEnvironment -Architecture amd64 -Path (Get-VSBuildTools2015VCVarsAllPath)
#>

Function Initialize-VSEnvironment {
    Param(
        [Parameter(Mandatory)]
        [ValidateSet('x86', 'amd64')]
        [string] $architecture,
        [Parameter(Mandatory)]
        [string] $path,
        [Parameter()]
        [AllowNull()]
        [string] $toolset
    )

    if (!(Test-Path $path)) {
        Write-Error ('{0} path not found.' -f $path);
        return;
    }

    $toolsetVersion = '';

    if ($toolset) {
        $toolsetVersion = ('-vcvars_ver={0}' -f $toolset);
    }

    # Taken from https://www.safaribooksonline.com/library/view/windows-powershell-cookbook/9780596528492/ch01s09.html
    $tempFile = [IO.Path]::GetTempFileName();

    # Store the output of cmd.exe. We also ask cmd.exe to output
    # the environment table after the batch file completes
    $call = ('"{0}" {1} {2} && set > "{3}"' -f $path, $architecture, $toolsetVersion, $tempFile);
    cmd /c $call;

    # Go through the environment variables in the temp file.
    # For each of them, set the variable in our local environment.
    Get-Content $tempFile | Foreach-Object {
        if ($_ -match "^(.*?)=(.*)$") {
            Set-Content "env:\$($matches[1])" $matches[2]
        }
    }

    Remove-Item $tempFile;
}