# Ensures that commands run in a Visual Studio environment. # This is required to run commands like cmake and ninja on Windows. $ErrorActionPreference = "Stop" if($env:VSINSTALLDIR -eq $null) { Write-Host "Loading Visual Studio environment, this may take a second..." $vswhere = "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" if (!(Test-Path $vswhere)) { throw "Command not found: vswhere (did you install Visual Studio?)" } $vsDir = (& $vswhere -prerelease -latest -property installationPath) if ($vsDir -eq $null) { $vsDir = Get-ChildItem -Path "C:\Program Files\Microsoft Visual Studio\2022" -Directory if ($vsDir -eq $null) { throw "Visual Studio directory not found." } $vsDir = $vsDir.FullName } Push-Location $vsDir try { $vsShell = (Join-Path -Path $vsDir -ChildPath "Common7\Tools\Launch-VsDevShell.ps1") . $vsShell -Arch amd64 -HostArch amd64 } finally { Pop-Location } } if($env:VSCMD_ARG_TGT_ARCH -eq "x86") { throw "Visual Studio environment is targeting 32 bit, but only 64 bit is supported." } if ($args.Count -gt 0) { $command = $args[0] $commandArgs = @() if ($args.Count -gt 1) { $commandArgs = @($args[1..($args.Count - 1)] | % {$_}) } # Don't print the full command as it may contain sensitive information like certificates # Just show the command name and basic info $displayArgs = @() foreach ($arg in $commandArgs) { if ($arg -match "^-") { # Include flags $displayArgs += $arg } elseif ($arg -match "\.(mjs|js|ts|cmake|zig|cpp|c|h|exe)$") { # Include file names $displayArgs += $arg } elseif ($arg.Length -gt 100) { # Truncate long arguments (likely certificates or encoded data) $displayArgs += "[REDACTED]" } else { $displayArgs += $arg } } Write-Host "$ $command $displayArgs" & $command $commandArgs exit $LASTEXITCODE }