Получите задания печати старше 1 часа с помощью powershell - PullRequest
0 голосов
/ 02 мая 2020

Я хочу найти все задания на печать, которые старше 1 часа и все еще находятся в очереди, и только те принтеры, у которых состояние «ошибка» / «Приостановлено».

Я пробовал приведенный ниже код, но не получил правильную разницу времени, также имя узла не отображается в результате. Может ли кто-нибудь помочь, пожалуйста?

Запрос:

$old = get-date -Format 'MM/dd/yyyy HH:MM:ss tt'

$PrinterStatus=Get-Printer -ComputerName "Hgjyu-79ujk"  | Get-Printjob | select 
   @{name="Name";expression={$_.printerName}} , @{name="Submitted Time";
   expression={$_.SubmittedTime}} , jobstatus, NodeName  , @{name="Document Name";
   expression={$_.documentname}} ,@{n='TIme Difference';
   e={[math]::Truncate(($_.old - $_.SubmittedTime).TotalHours)}} |

Where-Object {$_.jobstatus -ne "Normal" -or $_.SubmittedTime -gt (Get-Date).AddHours(-1) } |

Sort-Object -Property jobstatus -Descending 

Результат:

Submitted Time : 12/4/2020 7:36:30 PM
JobStatus      : Error
NodeName       : 
Document Name  : NewDoc
Difference     : -17697523

1 Ответ

0 голосов
/ 02 мая 2020

Пожалуйста, используйте блоки кода для кода при публикации вопроса.

-Format в Get-Date возвращает строку, поэтому вы не можете сравнить $old с $_.SubmittedTime

Get-PrintJob возвращает MSFT_PrintJob , поэтому он не содержит значение NodeName. Однако у него есть свойство PrinterName.

Пример


$CurrentTime = Get-Date

Get-Printer -ComputerName "Hgjyu-79ujk" | 
    Get-Printjob |
        Where-Object {$_.jobstatus -ne "Normal" -and $_.SubmittedTime -gt (Get-Date).AddHours(-1) } |  # You want -and here.
        Select-Object @{name="Name";expression={$_.printerName}}, 
        @{name="Submitted Time";expression={$_.SubmittedTime}}, 
        jobstatus, PrinterName, 
        @{name="Document Name";expression={$_.documentname}},
        @{n='Time Difference';e={[math]::Truncate(($CurrentTime - $_.SubmittedTime).TotalHours)}} | 
        Sort-Object -Property jobstatus -Descending

РЕДАКТИРОВАТЬ

Согласно вашему комментарию, если NodeName существует как часть Get-Printer, тогда вы можете сделать это:

$CurrentTime = Get-Date

Get-Printer -ComputerName "Hgjyu-79ujk" | Foreach-Object { 
    $Printer = $_
    $Printer | Get-Printjob |
        Where-Object {$_.jobstatus -ne "Normal" -and $_.SubmittedTime -gt (Get-Date).AddHours(-1) } |  # You want -and here.
        Select-Object @{name="Name";expression={$_.printerName}}, 
        @{name="Submitted Time";expression={$_.SubmittedTime}}, 
        jobstatus, @{name="NodeName";expression={$Printer.NodeName}}, 
        @{name="Document Name";expression={$_.documentname}},
        @{n='Time Difference';e={[math]::Truncate(($CurrentTime - $_.SubmittedTime).TotalHours)}} | 
        Sort-Object -Property jobstatus -Descending
}

Обратите внимание, что вывод, который вы видите в PowerShell, может быть переименован, чтобы иметь метку NodeName. Объект MSFT_Printer обычно не имеет этого свойства. Вы можете подтвердить это, выполнив нижеприведенный список, чтобы увидеть все свойства возвращаемого объекта:

(Get-Printer)[0] | Format-List *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...