Skip to content

Import-PrinterDrivers

Print Management: Installs printer drivers asynchronously from a CSV file.

#Requires -Version 5.1
#Requires -Modules PrintManagement

[CmdletBinding()]
Param(
    [Parameter(Mandatory = $true)]
    [string]$CsvFile,
    [string]$Delimiter = ';',
    [ValidateSet('Unicode', 'UTF7', 'UTF8', 'ASCII', 'UTF32', 'BigEndianUnicode', 'Default', 'OEM')]
    [string]$FileEncoding = 'UTF8',
    [int]$MaxJobCount = 100,
    [pscredential]$AccessAccount
)

Process {
    $ts = 'Get-Date -Format "yyyy-MM-dd HH:mm:ss"'
    $err = $false
    $result = @()
    $errors = @()
    $output = @()
    $jobs = [System.Collections.Generic.Dictionary[int, string]]::new()
    $cim = $null
    try {
        if (-not (Test-Path -Path $CsvFile -ErrorAction SilentlyContinue)) { throw "$CsvFile does not exist" }
        $drivers = Import-Csv -Path $CsvFile -Delimiter $Delimiter -Encoding $FileEncoding -ErrorAction Stop `
            -Header @('DriverName', 'ComputerName', 'InfFilePath')
        foreach ($item in $drivers) {
            if ($item.ComputerName -eq 'ComputerName') { continue }
            if ([System.String]::IsNullOrWhiteSpace($item.ComputerName)) { $item.ComputerName = [System.Net.DNS]::GetHostByName('').HostName }
            $cim = if ($null -eq $AccessAccount) { New-CimSession -ComputerName $item.ComputerName -ErrorAction Stop }
                   else { New-CimSession -ComputerName $item.ComputerName -Credential $AccessAccount -ErrorAction Stop }
            if (Get-PrinterDriver -CimSession $cim -Name $item.DriverName.Trim() -ComputerName $item.ComputerName -ErrorAction SilentlyContinue) {
                $output += "$(Invoke-Expression $ts) Printer driver $($item.DriverName) already exists on $($item.ComputerName)"
                Remove-CimSession $cim -ErrorAction SilentlyContinue
                continue
            }
            $Error.RemoveAt(0)
            if ([System.String]::IsNullOrWhiteSpace($item.InfFilePath)) {
                $job = Add-PrinterDriver -AsJob -CimSession $cim -Name $item.DriverName.Trim() -ComputerName $item.ComputerName
            }
            else {
                $job = Add-PrinterDriver -AsJob -CimSession $cim -Name $item.DriverName.Trim() -ComputerName $item.ComputerName -InfPath $item.InfFilePath
            }
            $jobs.Add($job.ID, $item.DriverName)
            Remove-CimSession $cim -ErrorAction SilentlyContinue
            do {
                $running = Get-Job -State Running | Where-Object { $jobs.Keys -contains $_.Id }
                if ($running -and $running.Count -gt $MaxJobCount) { Start-Sleep -Seconds 5 } else { break }
            } while ($true)
        }
        do {
            $running = Get-Job -State Running | Where-Object { $jobs.Keys -contains $_.Id }
            if ($running) { Start-Sleep -Seconds 5 } else { break }
        } while ($true)
        $completed = Get-Job | Where-Object { $jobs.Keys -contains $_.Id }
        foreach ($j in $completed) {
            if ($j.JobStateInfo.State -eq 'Failed') {
                $errors += "$(Invoke-Expression $ts) Install printer driver: $($jobs[$j.Id]) failed."
                $err = $true
            }
            if ($j.JobStateInfo.State -eq 'Completed') {
                $result += "$(Invoke-Expression $ts) Install printer driver: $($jobs[$j.Id]) succeeded."
            }
        }
        if ($err) { Write-Output $errors }
        Write-Output $result
        Write-Output $output
        if ($err) { throw "An error has occurred during import" }
    }
    catch { Write-Output $result; Write-Output $output; throw }
}

Path and filename of the CSV file to import.

Delimiter that separates the property values in the CSV file.

Type of character encoding used in the CSV file.

Maximum number of concurrent executed jobs.

User account that has permission to perform this action.

An interactive directory of PowerShell scripts.