Get-Printer -AsJob, как найти ComputerName при ошибке - PullRequest
1 голос
/ 11 июля 2019

Мы пытаемся получить все установленные принтеры оптом.Для этого мы используем переключатель -AsJob на Get-Printer CmdLet.Это прекрасно работает, когда все ComputerNames существуют, но когда есть тот, который не существует, правильно выдается ошибка.

Пример

$ComputerName = @('Computer1', 'NonExisting', 'Computer2')

$GetPrinterJobs = Foreach ($C in $ComputerName) {
    Get-Printer -ComputerName $C -AsJob
}

$GetPrinterJobs | Wait-Job -EA Ignore | Receive-Job

Этот код будетвыбросить одну ошибку для NonExisting ComputerName.Как можно увидеть, что ошибка на самом деле исходит от ComputerName NonExisting?

Get-Printer: служба диспетчера очереди недоступна.Убедитесь, что служба очереди печати запущена.

С помощью приведенной ниже @JosefZ это решено следующим образом:

$GetPrinterJobs = Foreach ($C in $ComputerName) {
    $C
    Get-Printer -ComputerName $C -AsJob
}

$null = Get-Job | Wait-Job -EA Ignore

$GetPrinterJobResults = for ( $i = 0; $i -lt $GetPrinterJobs.Count; $i += 2 ) {

    $ReceiveParams = @{
        ErrorVariable = 'JobError'
        ErrorAction   = 'SilentlyContinue'
    }
    $ReceivedJobResult = $GetPrinterJobs[$i + 1] | Receive-Job @ReceiveParams

    [PSCustomObject]@{
        ComputerName = $GetPrinterJobs[$i]
        State        = $GetPrinterJobs[$i + 1].State
        Data         = $ReceivedJobResult
        Error        = if ($JobError) {
            $JobError
            $JobError.ForEach( { $Error.Remove($_) })
        }
    }
}

$GetPrinterJobResults

1 Ответ

1 голос
/ 11 июля 2019

Вот мой старый школьный обходной путь:

$ComputerName = @('Computer1', 'NonExisting', 'Computer2')

$GetPrinterJobs = Foreach ($C in $ComputerName) {
    $C
    Get-Printer -ComputerName $C -AsJob
}

$GetPrinterJobResults = $GetPrinterJobs | 
    Where-Object { $_.GetType().Name -ne 'String'} | 
        Wait-Job -EA Ignore | Receive-Job

for ( $i = 0; $i -lt $GetPrinterJobs.Count; $i+=2 ) {
    @{
        $GetPrinterJobs[$i] = $GetPrinterJobs[$i + 1].State
    }
}

Должен вернуть что-то вроде

Name          Value                                               
----          -----                                               
Computer1     Completed                                           
NonExisting   Failed                                              
Computer2     Completed                                           
...