Public/Authoral/Update-DotnetProjects.ps1

# Update one project packages
function Update-DotnetPackage {
    param (
        [string]
        [parameter(ValueFromPipelineByPropertyName, Mandatory = $true)]
        $project
    )

    $return = $false

    # Get outdated packages
    $packageLineList = dotnet list $project package --outdated

    foreach ($line in $packageLineList) {
        Write-Host $line

        $match = $line -match '>\s(\S*)\s*\S*\s*\S*\s*(\S*)'
        if (!$match) {
            # the line doesn't contain a package information, continue
            continue
        }

        $added = dotnet add $project package $Matches.1 --version $Matches.2
        if ($? -ne 0) {
            # error while updating the package
            Write-Error "dotnet add $project package $($Matches.1) --version $($Matches.2) exit with code $($?)"
            Write-Host $added
            break
        }

        $return = $true
    }

    return $return
}

function Update-DotnetProject {

    begin {
        # Restore dependencies
        dotnet restore --interactive
        $updated = $false
    }

    process {

        # Get all project list in the solution
        $projectList = dotnet sln list

        foreach ($path in $projectList) {
            if ($path -eq "Projetos" -or $path -eq "--------") {
                # The line doesn't contain a path, continue
                continue
            }

            $path
            # Update project dependencies
            $projectUpdated = Update-DotnetPackages -project $path

            if ($LASTEXITCODE -ne 0) {
                #The update fail, exit
                throw
                # exit $LASTEXITCODE
            }

            $updated = $updated -or $projectUpdated
        }

        if (!$updated) {
            # No packages to update found, exit
            Write-Host "Nothing to update"
        }
    }
}