[CmdletBinding()] param( [string] $ConfigPath = (Join-Path $HOME '.wslconfig'), [version] $WslVersion ) $ErrorActionPreference = 'Stop' $managedContent = @' # Managed by dotfiles/topgrade/sync-wsl-cgroup-workaround.ps1 for affected WSL versions. [wsl2] isolateDistroCgroup=false '@ + [Environment]::NewLine if (-not $PSBoundParameters.ContainsKey('WslVersion')) { $versionOutput = wsl.exe --version if ($LASTEXITCODE -ne 0) { throw "wsl.exe --version failed with exit code $LASTEXITCODE" } $versionText = ($versionOutput -join "`n") -replace "`0", '' $match = [regex]::Match($versionText, '\d+\.\d+\.\d+\.\d+') if (-not $match.Success) { throw 'Cannot determine the WSL version.' } $WslVersion = [version] $match.Value } $affected = $WslVersion -ge [version] '2.9.8.0' -and $WslVersion -le [version] '2.9.11.0' $currentContent = if (Test-Path -LiteralPath $ConfigPath) { Get-Content -LiteralPath $ConfigPath -Raw } if ($affected) { if ($null -eq $currentContent) { Set-Content -LiteralPath $ConfigPath -Value $managedContent -NoNewline Write-Host "Applied WSL cgroup workaround for WSL $WslVersion. Run 'wsl --shutdown' to activate it." } elseif ($currentContent -ne $managedContent) { throw "$ConfigPath exists and is not managed by this script." } } elseif ($currentContent -eq $managedContent) { Remove-Item -LiteralPath $ConfigPath Write-Host "Removed obsolete WSL cgroup workaround for WSL $WslVersion. Run 'wsl --shutdown' to activate isolation." }