Public/Printing/Get-StuckPrintJobs.ps1

<#
Copyright © 2024 Integris. For internal company use only. All rights reserved.
#>


FUNCTION Get-StuckPrintJobs {
    <#
    .SYNOPSIS
    Retrieves stuck print jobs for a specified printer or all printers.
 
    .DESCRIPTION
    This function retrieves stuck print jobs for a specified printer or all printers. If stuck print jobs are found, it displays their details and returns the list of jobs. If no stuck print jobs are found, it displays an appropriate message and returns $null.
 
    .PARAMETER Name
    Specifies the name of the printer for which to retrieve stuck print jobs.
 
    .PARAMETER All
    Indicates that the function should retrieve stuck print jobs for all printers.
 
    .EXAMPLE
    Get-StuckPrintJobs -Name "Printer1"
    Retrieves and displays stuck print jobs for the printer named "Printer1".
 
    .EXAMPLE
    Get-StuckPrintJobs -All
    Retrieves and displays stuck print jobs for all printers.
 
    .INPUTS
    System.String. The function accepts a string input for the printer name.
    System.Management.Automation.SwitchParameter. The function accepts a switch parameter to retrieve jobs for all printers.
 
    .OUTPUTS
    Returns a count of stuck print jobs.
 
    .NOTES
    Ensure you have the necessary permissions to query print job information.
    #>


    [CmdletBinding(DefaultParameterSetName = 'ByName')]
    param (
        [Parameter(Position = 0, Mandatory = $true, ParameterSetName = 'ByName', ValueFromPipeline = $true)]
        [string]$Name,

        [Parameter(ParameterSetName = 'All')]
        [switch]$All
    )

    process {
        if ($PSCmdlet.ParameterSetName -eq 'All') {
            $printers = Get-Printer
            foreach ($printer in $printers) {
                $jobs = Get-PrintJob -PrinterName $printer.Name
                if ($jobs) {
                    Write-Host "Stuck print jobs found for printer '$($printer.Name)':"
                    $jobs | ForEach-Object { Write-Host "Job ID: $($_.ID), Document: $($_.DocumentName), Status: $($_.JobStatus)" }
                    RETURN ($jobs | Measure-Object).Count
                } else {
                    Write-Host "No stuck print jobs for printer '$($printer.Name)'."
                    RETURN ($jobs | Measure-Object).Count
                }
            }
        } else {
            $jobs = Get-PrintJob -PrinterName $Name
            if ($jobs) {
                Write-Host "Stuck print jobs found for printer '$Name':" -ForegroundColor Red
                $jobs | ForEach-Object { Write-Host "Job ID: $($_.ID), Document: $($_.DocumentName), Status: $($_.JobStatus)" }
                RETURN ($jobs | Measure-Object).Count
            } else {
                Write-Host "No stuck print jobs for printer '$Name'." -ForegroundColor Green
                RETURN ($jobs | Measure-Object).Count
            }
        }
    }
}