Public/Set-SpecDefaultDellorOKIPrinter.ps1

Function Set-SpecDefaultDellOrOKIPrinter {
    <#
    .SYNOPSIS
        Sets the default printer to a NON-STAR printer if the current default printer is either a STAR printer or does not contain an underscore.
 
    .DESCRIPTION
        This function checks for printers that match the specified STAR printer name or do not contain an underscore (_) in their names and sets the first matching NON-STAR printer with "HP_" or "OKI_" in its name as the new default printer.
 
    .PARAMETER None
        This function does not take any parameters.
 
    .EXAMPLE
        Set-SpecDefaultDellOrOKIPrinter
        # Sets the default printer to a non-STAR printer if the current default printer is either a STAR printer or does not contain an underscore (_).
 
    .OUTPUTS
        System.Int32
        Returns one of the following exit codes:
            - 600: The default printer was successfully changed to a non-STAR printer.
            - 601: Failed to set the default printer to a new printer.
            - 602: No changes were needed; the current printer is correctly set as the default.
 
    .NOTES
        Author: owen.heaume
        Version: - 1.0
                 - 1.2 Refactor Printui.dll into start-process so it can be tested for with pester
    #>


    [cmdletbinding()]
    param ()

    begin {
        $MatchPrinterName = "STAR"

        $currentDefaultPrinter = (Get-WmiObject -Query "SELECT * FROM Win32_Printer WHERE Default=$true").name
        Write-Verbose "The current default printer is: $currentDefaultPrinter"

    }

    process {
        # checks to see if a STAR printer is current default for the user - if so it needs to change
        If ($CurrentDefaultPrinter -match $MatchPrinterName -or $currentDefaultPrinter -notmatch "_") {
            Write-Verbose "Printer '$currentDefaultPrinter' is currently set to default"

            # loops through list of printers and sets the first matching NON-STAR printer as the default
            ForEach ($printer in (Get-Printer).name) {
                If ($printer -match "HP_" -or $printer -match "OKI_") {
                    Write-Verbose "Default printer being set to new printer $printer"
                    Try {
                        # Define the arguments to be passed to rundll32.exe
                        $arguments = "PRINTUI.DLL,PrintUIEntry", "/y", "/n", $printer

                        # Launch the command using Start-Process
                        Start-Process -FilePath "C:\Windows\System32\rundll32.exe" -ArgumentList $arguments -ErrorAction Stop
                        Start-Sleep 2
                        $NewDefaultPrinter = (Get-WmiObject -Query "SELECT * FROM Win32_Printer WHERE Default=$true").name
                        Write-Verbose "New default printer set to: $NewDefaultPrinter"
                        return 600
                    } Catch {
                        Write-Warning "Failed to set default printer."
                        return 601
                    }
                }
            }
        }

        Write-verbose "No changes need to be made - current printer correctly set as default."
        return 602
    }
}