script/tools/public/Update-CbsPSModule.ps1

Function Update-CbsPSModule {
    [CmdletBinding(SupportsShouldProcess)]
    Param(
        [Parameter(Mandatory,ValueFromPipeline)][System.Management.Automation.PSModuleInfo]$Module
    )

    # Get-Module -ListAvailable `
    # | ? RepositorySourceLocation -match "www.powershellgallery.com"
    # | Group-Object Name `
    # | % {$_.Group | Sort-Object Version | Select-Object -Last 1 } `
    # | Update-CbsPSModule

    Begin {
        $ErrorActionPreference = "Stop"
        $pipeline = {
            # Invoke-CbsRunspace { try { $_ | Invoke-ProcessModule } catch { $_ | Write-Output } }
            Invoke-ProcessModule
        }.GetSteppablePipeline()

        $pipeline.Begin($true)
    }

    Process {
        if (!$PSCmdlet.ShouldProcess($Module)) { return }

        $pipeline.Process($Module)
    }

    End {
        $pipeline.End()
    }
}

Function Invoke-ProcessModule {
    Param(
        [Parameter(Mandatory,ValueFromPipeline)][System.Management.Automation.PSModuleInfo]$Module
    )

    Process {
        Write-Host "Processing $($Module.Name):$($Module.Version)"

        $newModule = Find-Module -Name $Module.Name -ErrorAction SilentlyContinue

        if (!$newModule) { return }

        if ($newModule.Version -gt $Module.Version) {

            Update-Module -Name $Module.Name

            [PSCustomObject]@{
                Name       = $Module.Name
                OldVersion = $Module.Version
                NewVersion = $newModule.Version
            }
        }
    }
}