首页 > 解决方案 > 使用 powershell 获取超过 1 小时的打印作业

问题描述

我想搜索仍在队列中超过 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

标签: powershellprinting

解决方案


发布问题时,请使用代码块作为代码。

-FormatinGet-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 *

推荐阅读