/ .pipelines / verifyAndSetLatestVCToolsVersion.ps1
verifyAndSetLatestVCToolsVersion.ps1
 1  # Build common vswhere base arguments
 2  $vsWhereBaseArgs = @('-latest', '-requires', 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64')
 3  if ($env:VCWhereExtraVersionTarget) {
 4      # Add version target if specified (e.g., '-version [18.0,19.0)' for VS2026)
 5      $vsWhereBaseArgs += $env:VCWhereExtraVersionTarget.Split(' ')
 6  }
 7  
 8  $VSInstances = ([xml](& 'C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe' @vsWhereBaseArgs -include packages -format xml))
 9  $VSPackages = $VSInstances.instances.instance.packages.package
10  $LatestVCPackage = ($VSPackages | ? { $_.id -eq "Microsoft.VisualCpp.Tools.Core" })
11  $LatestVCToolsVersion = $LatestVCPackage.version;
12  
13  $VSRoot = (& 'C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe' @vsWhereBaseArgs -property 'resolvedInstallationPath')
14  $VCToolsRoot = Join-Path $VSRoot "VC\Tools\MSVC"
15  
16  # We have observed a few instances where the VC tools package version actually
17  # differs from the version on the files themselves. We might as well check
18  # whether the version we just found _actually exists_ before we use it.
19  # We'll use whichever highest version exists.
20  $PackageVCToolPath = Join-Path $VCToolsRoot $LatestVCToolsVersion
21  If ($Null -Eq (Get-Item $PackageVCToolPath -ErrorAction:Ignore)) {
22      $VCToolsVersions = Get-ChildItem $VCToolsRoot | ForEach-Object {
23          [Version]$_.Name
24      } | Sort -Descending
25      $LatestActualVCToolsVersion = $VCToolsVersions | Select -First 1
26  
27      If ([Version]$LatestVCToolsVersion -Ne $LatestActualVCToolsVersion) {
28          Write-Output "VC Tools Mismatch: Directory = $LatestActualVCToolsVersion, Package = $LatestVCToolsVersion"
29          $LatestVCToolsVersion = $LatestActualVCToolsVersion.ToString(3)
30      }
31  }
32  
33  Write-Output "Latest VCToolsVersion: $LatestVCToolsVersion"
34  
35  # VS2026 (MSVC 14.50+) doesn't need explicit VCToolsVersion - let MSBuild auto-select
36  $MajorMinorVersion = [Version]::Parse($LatestVCToolsVersion)
37  If ($MajorMinorVersion.Major -eq 14 -and $MajorMinorVersion.Minor -ge 50) {
38      Write-Output "VS2026 detected (MSVC 14.50+). Skipping VCToolsVersion override to allow MSBuild auto-selection."
39  } Else {
40      Write-Output "Updating VCToolsVersion environment variable for job"
41      Write-Output "##vso[task.setvariable variable=VCToolsVersion]$LatestVCToolsVersion"
42  }