Scripts/Get-PSWSUSUpdate.ps1

function Get-PSWSUSUpdate {
    <#
    .SYNOPSIS
        Retrieves information from a wsus update.
         
    .DESCRIPTION
        Retrieves information from a wsus update. Depending on how the information is presented in the search, more
        than one update may be returned.
          
    .PARAMETER Update
        String to search for. This can be any string for the update to include
        KB article numbers, name of update, category, etc... Use of wildcards (*,%) are not allowed in search!
 
    .PARAMETER IncludeText
        Text to include in search
 
    .PARAMETER ExcludeText
        Text to exclude from search
 
    .PARAMETER ApprovedState
        Approval states to search for
 
    .PARAMETER UpdateType
        Update types to search for
 
    .PARAMETER ComputerTargetGroups
        List of target groups to search for approvals
 
    .PARAMETER ExcludeOptionalUpdates
        Exclude optional updates from the list
 
    .PARAMETER IsWsusInfrastructureUpdate
        Filter for WSUS infrastructure updates
 
    .PARAMETER IncludedInstallationState
        Installation states to search for
      
    .PARAMETER ExcludedInstallState
        Installation states to exclude
 
    .PARAMETER FromArrivalDate
        Minimum arrival date to search for
 
    .PARAMETER ToArrivalDate
        Maximum arrival date to search for
 
    .PARAMETER FromCreationDate
        Minimum creation date to search for
 
    .PARAMETER ToCreationDate
        Maximum creation date to search for
 
    .PARAMETER UpdateApprovalAction
        Update approval actions to search for
 
    .PARAMETER UpdateSource
        Update sources to search for
 
    .PARAMETER Category
        List of update categories to search.
 
    .PARAMETER Classification
        List of update classifications to search
         
    .NOTES
        Name: Get-PSWSUSUpdate
        Author: Boe Prox
        Version History:
            1.2 | 18 Feb 2015
                -Renamed to Get-PSWSUSUpdate
                -Add multiple parameters
            1.0 | 24 Sept 2010
                -Initial Version
                
    .LINK
        https://learn-powershell.net
 
    .EXAMPLE
        Get-PSWSUSUpdate
 
        Description
        -----------
        This command will list every update on the WSUS Server.
         
    .EXAMPLE
        Get-PSWSUSUpdate -update "Exchange"
 
        Description
        -----------
        This command will list every update that has 'Exchange' in it.
     
    .EXAMPLE
        Get-PSWSUSUpdate -update "KB925474"
 
        Description
        -----------
        This command will list every update that has 'KB925474' in it.
 
    .EXAMPLE
        $Categories = Get-PSWSUSCategory|Where{$_.title -match 'server 2012'}
        Get-PSWSUSUpdate -Category $Categories
 
        Description
        -----------
        Gets all updates matching the Windows Server 2012 category
        
    #>
 
    [cmdletbinding(
        DefaultParameterSetName = 'All'
    )]
        Param(
            [Parameter(Position=0,ValueFromPipeline = $True,ParameterSetName = 'Update')]
            [string[]]$Update,
            [Parameter(ParameterSetName='UpdateScope')]
            [string]$IncludeText,
            [Parameter(ParameterSetName='UpdateScope')]
            [string]$ExcludeText,
            [Parameter(ParameterSetName='UpdateScope')]  
            [Microsoft.UpdateServices.Administration.ApprovedStates]$ApprovedState,
            [Parameter(ParameterSetName='UpdateScope')]
            [Microsoft.UpdateServices.Administration.UpdateTypes]$UpdateType,
            [Parameter(ParameterSetName='UpdateScope')]
            [string[]]$ComputerTargetGroups,
            [Parameter(ParameterSetName='UpdateScope')]
            [switch]$ExcludeOptionalUpdates,
            [Parameter(ParameterSetName='UpdateScope')]
            [switch]$IsWsusInfrastructureUpdate,
            [Parameter(ParameterSetName='UpdateScope')]
            [Microsoft.UpdateServices.Administration.UpdateInstallationStates]$IncludedInstallationState,
            [Parameter(ParameterSetName='UpdateScope')]
            [Microsoft.UpdateServices.Administration.UpdateInstallationStates]$ExcludedInstallState,
            [Parameter(ParameterSetName='UpdateScope')]
            [DateTime]$FromArrivalDate,
            [Parameter(ParameterSetName='UpdateScope')]
            [DateTime]$ToArrivalDate,
            [Parameter(ParameterSetName='UpdateScope')]
            [DateTime]$FromCreationDate,
            [Parameter(ParameterSetName='UpdateScope')]
            [DateTime]$ToCreationDate,
            [Parameter(ParameterSetName='UpdateScope')]
            [Microsoft.UpdateServices.Administration.UpdateApprovalActions]$UpdateApprovalAction,
            [Parameter(ParameterSetName='UpdateScope')]
            [Microsoft.UpdateServices.Administration.UpdateSources]$UpdateSource,
            [Parameter(ParameterSetName='UpdateScope')]
            [Microsoft.UpdateServices.Internal.BaseApi.UpdateCategory[]]$Category,
            [Parameter(ParameterSetName='UpdateScope')]
            [Microsoft.UpdateServices.Internal.BaseApi.UpdateClassification[]]$Classification
        )
    Begin {                
        $ErrorActionPreference = 'stop'  
        If ($PSCmdlet.ParameterSetName -eq 'UpdateScope') {
            $UpdateScope = New-Object Microsoft.UpdateServices.Administration.UpdateScope  
            If ($PSBoundParameters['ApprovedState']) {
                $UpdateScope.ApprovedStates = $ApprovedState
            }
            If ($PSBoundParameters['IncludedInstallationState']) {
                $UpdateScope.IncludedInstallationStates = $IncludedInstallationState
            }
            If ($PSBoundParameters['ExcludedInstallState']) {
                $UpdateScope.ExcludedInstallStates = $ExcludedInstallState
            }
            If ($PSBoundParameters['UpdateApprovalAction']) {
                $UpdateScope.UpdateApprovalActions = $UpdateApprovalAction
            }
            If ($PSBoundParameters['UpdateSource']) {
                $UpdateScope.UpdateSources = $UpdateSource
            }
            If ($PSBoundParameters['UpdateType']) {
                $UpdateScope.UpdateTypes = $UpdateType
            }
            If ($PSBoundParameters['FromArrivalDate']) {
                $UpdateScope.FromArrivalDate = $FromArrivalDate
            }
            If ($PSBoundParameters['ToArrivalDate']) {
                $UpdateScope.ToArrivalDate = $ToArrivalDate
            }
            If ($PSBoundParameters['FromCreationDate']) {
                $UpdateScope.FromCreationDate = $FromCreationDate
            }
            If ($PSBoundParameters['ToCreationDate']) {
                $UpdateScope.ToCreationDate = $ToCreationDate
            }
            If ($PSBoundParameters['ExcludeOptionalUpdates']) {
                $UpdateScope.ExcludeOptionalUpdates = $ExcludeOptionalUpdates
            }
            If ($PSBoundParameters['IsWsusInfrastructureUpdate']) {
                $UpdateScope.IsWsusInfrastructureUpdate = $IsWsusInfrastructureUpdate
            }
            If ($PSBoundParameters['Category']) {
                [void]$UpdateScope.Categories.AddRange($Category)
            }
            If ($PSBoundParameters['Classification']) {
                [void]$UpdateScope.Classifications.AddRange($Classification)
            }
            If ($PSBoundParameters['IncludeText']) {
                $UpdateScope.TextIncludes = $IncludeText
            }
            If ($PSBoundParameters['ExcludeText']) {
                $UpdateScope.TextNotIncludes = $ExcludeText
            }
            If ($PSBoundParameters['ComputerTargetGroups']) {
                $Groups = @{}
                $Wsus.GetComputerTargetGroups() | ForEach {                    
                    $Groups[$_.Name]=$_
                }
                ForEach ($Group in $ComputerTargetGroups) {
                    Write-Verbose "Adding Target Group: $($Group)"
                    [void]$UpdateScope.ApprovedComputerTargetGroups.Add($Groups[$Group])
                }
            }
        }
    }
    Process {
        Switch ($PSCmdlet.ParameterSetName) {
            'Update' {
                ForEach ($Item in $Update) {
                    Write-Verbose "Searching for $($Update)"
                    $Wsus.SearchUpdates($Item)
                }            
            }
            'UpdateScope' {
                $Wsus.getupdates($UpdateScope)
            }
            'All'{
                $Wsus.getupdates()
            }
        }
    }
    End {        
        $ErrorActionPreference = 'continue' 
    }   
}