Public/Get-PendingUpdates.ps1

function Get-PendingUpdates {
    <#
    .SYNOPSIS
    Retrieves information about pending Windows Updates.
 
    .DESCRIPTION
    Checks for pending Windows Updates and returns detailed information about each update
    including size, importance, download status, and reboot requirements. This provides
    visibility into what updates are available before installing them.
 
    .PARAMETER IncludeDetails
    Include additional details like KB numbers, descriptions, and security bulletin IDs.
 
    .PARAMETER IncludeDrivers
    Include driver updates in the search. By default, only software updates are returned.
 
    .PARAMETER LogPath
    Optional path to a log file for detailed logging.
 
    .EXAMPLE
    Get-PendingUpdates
    Returns basic information about all pending software updates.
 
    .EXAMPLE
    Get-PendingUpdates -IncludeDetails -IncludeDrivers
    Returns detailed information about all pending updates including drivers.
 
    .EXAMPLE
    $pending = Get-PendingUpdates
    if ($pending.Count -gt 0) {
        Write-Host "Found $($pending.Count) pending updates"
        $pending | Format-Table Title, SizeMB, Importance, IsDownloaded
    }
 
    .EXAMPLE
    Get-PendingUpdates | Where-Object { $_.Importance -eq 'Critical' }
    Returns only critical pending updates.
 
    .OUTPUTS
    System.Object[]
    Returns an array of objects containing update information:
    - Title: Update title
    - SizeMB: Update size in megabytes
    - Importance: Critical, Important, Moderate, Low
    - IsDownloaded: Whether the update is already downloaded
    - RebootRequired: Whether the update requires a reboot
    - ReleaseDate: When the update was released
    - KBArticleIDs: Associated KB article numbers (if IncludeDetails)
    - Description: Update description (if IncludeDetails)
 
    .NOTES
    Author: CSOLVE Scripts
    Version: 1.0.0
     
    This function provides a user-friendly interface to check pending updates before
    deciding whether to install them using Install-WindowsUpdate.
    #>

    [CmdletBinding()]
    param(
        [Parameter()]
        [switch]$IncludeDetails,
        
        [Parameter()]
        [switch]$IncludeDrivers,
        
        [Parameter()]
        [string]$LogPath
    )

    try {
        # Call the private function to do the heavy lifting
        $pendingUpdates = Get-WUPendingUpdates -LogPath $LogPath
        
        if (-not $pendingUpdates -or $pendingUpdates.Count -eq 0) {
            Write-Verbose "No pending updates found"
            return @()
        }
        
        # Filter out drivers if not requested
        if (-not $IncludeDrivers) {
            $pendingUpdates = $pendingUpdates | Where-Object { $_.Type -ne 'Driver' }
        }
        
        # Create user-friendly output objects
        $results = foreach ($update in $pendingUpdates) {
            $updateInfo = [PSCustomObject]@{
                Title = $update.Title
                SizeMB = [math]::Round($update.SizeKB / 1024, 1)
                Importance = $update.Importance
                IsDownloaded = $update.IsDownloaded
                RebootRequired = $update.RebootRequired
                ReleaseDate = $update.ReleaseDate
                Type = $update.Type
            }
            
            # Add detailed information if requested
            if ($IncludeDetails) {
                $updateInfo | Add-Member -NotePropertyName 'KBArticleIDs' -NotePropertyValue $update.KBArticleIDs
                $updateInfo | Add-Member -NotePropertyName 'Description' -NotePropertyValue $update.Description
                $updateInfo | Add-Member -NotePropertyName 'SecurityBulletinIDs' -NotePropertyValue $update.SecurityBulletinIDs
                $updateInfo | Add-Member -NotePropertyName 'DownloadStatus' -NotePropertyValue $update.DownloadStatus
            }
            
            $updateInfo
        }
        
        # Display summary information
        if ($results.Count -gt 0) {
            $totalSizeMB = [math]::Round(($results | Measure-Object -Property SizeMB -Sum).Sum, 1)
            $criticalCount = ($results | Where-Object { $_.Importance -eq 'Critical' }).Count
            $downloadedCount = ($results | Where-Object { $_.IsDownloaded -eq $true }).Count
            $rebootCount = ($results | Where-Object { $_.RebootRequired -eq $true }).Count
            
            Write-Host "`nPending Updates Summary:" -ForegroundColor Cyan
            Write-Host " Total Updates: $($results.Count)" -ForegroundColor White
            Write-Host " Total Size: $totalSizeMB MB" -ForegroundColor White
            Write-Host " Critical Updates: $criticalCount" -ForegroundColor $(if ($criticalCount -gt 0) { 'Yellow' } else { 'Green' })
            Write-Host " Already Downloaded: $downloadedCount" -ForegroundColor Green
            Write-Host " Require Reboot: $rebootCount" -ForegroundColor $(if ($rebootCount -gt 0) { 'Yellow' } else { 'Green' })
            
            if ($IncludeDrivers) {
                $driverCount = ($results | Where-Object { $_.Type -eq 'Driver' }).Count
                Write-Host " Driver Updates: $driverCount" -ForegroundColor White
            }
            Write-Host ""
        }
        
        return $results
        
    } catch {
        Write-Error "Failed to retrieve pending updates: $($_.Exception.Message)"
        return @()
    }
}