/ .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 }