#Requires -RunAsAdministrator $ErrorActionPreference = 'Continue' function Invoke-Com { param([scriptblock]$Fn, [int]$Retries = 5, [int]$DelayMs = 2000) for ($i = 0; $i -lt $Retries; $i++) { try { return & $Fn } catch { if ($_.Exception.HResult -eq -2147418111) { Start-Sleep -Milliseconds $DelayMs; continue } throw } } return $null } $dte = New-Object -ComObject TcXaeShell.DTE.17.0 $dte.MainWindow.Visible = $true try { $dte.SuppressUI = $false } catch {} $dte.Solution.Open('C:\Users\tonycao\work\twincat3-auto-cli\TwinCAT_EL6695_Primary\TwinCATProject1.sln') Write-Host "open issued, waiting 30s..." Start-Sleep 30 Write-Host "BuildState pre-build: $(Invoke-Com { $dte.Solution.SolutionBuild.BuildState })" Write-Host "issuing build..." Invoke-Com { $dte.ExecuteCommand('Build.BuildSolution') } | Out-Null for ($i = 0; $i -lt 30; $i++) { $bs = Invoke-Com { $dte.Solution.SolutionBuild.BuildState } -Retries 2 -DelayMs 1000 Write-Host " [$($i*3)s] BuildState=$bs" if ($bs -eq 3) { break } Start-Sleep 3 } Write-Host "--- output window (Build pane) ---" try { $ow = $dte.ToolWindows.OutputWindow foreach ($pane in $ow.OutputWindowPanes) { if ($pane.Name -match 'Build|����') { $td = $pane.TextDocument $txt = $td.StartPoint.CreateEditPoint() $content = $txt.GetText($td.EndPoint) $lines = $content -split "`r?`n" Write-Host "pane '$($pane.Name)': $($lines.Count) lines, last 25:" $lines | Select-Object -Last 25 | ForEach-Object { Write-Host " $_" } } } } catch { Write-Host "output window err: $_" }