#!/usr/bin/env pwsh # fix-sln-duplicates.ps1 - Remove duplicate project entries from solution file param( [string]$SlnPath = "src/StellaOps.sln" ) $ErrorActionPreference = "Stop" Write-Host "=== Solution Duplicate Cleanup ===" -ForegroundColor Cyan Write-Host "Solution: $SlnPath" $content = Get-Content $SlnPath -Raw $lines = $content -split "`r?`n" # Track seen project names $seenProjects = @{} $duplicateGuids = @() $newLines = @() $skipNext = $false for ($i = 0; $i -lt $lines.Count; $i++) { $line = $lines[$i] if ($skipNext) { $skipNext = $false continue } # Check for project declaration if ($line -match 'Project\(.+\) = "([^"]+)",.*\{([A-F0-9-]+)\}"?$') { $name = $Matches[1] $guid = $Matches[2] if ($seenProjects.ContainsKey($name)) { Write-Host "Removing duplicate: $name ($guid)" -ForegroundColor Yellow $duplicateGuids += $guid # Skip this line and the next EndProject line $skipNext = $true continue } else { $seenProjects[$name] = $true } } $newLines += $line } # Remove GlobalSection references to duplicate GUIDs $finalLines = @() foreach ($line in $newLines) { $skip = $false foreach ($guid in $duplicateGuids) { if ($line -match $guid) { $skip = $true break } } if (-not $skip) { $finalLines += $line } } # Write back $finalLines -join "`r`n" | Set-Content $SlnPath -Encoding UTF8 -NoNewline Write-Host "" Write-Host "Removed $($duplicateGuids.Count) duplicate projects" -ForegroundColor Green