如何检查打印机是否处于某种状态超过30分钟?

时间:2016-05-16 10:38:59

标签: powershell logging

我有一个脚本,通过WMI检查所有打印服务器中所有打印机的状态。结果如下所示:

Name                            location                       Status                                                   
----                            --------                       ------                                                 
Xerox wc275.1                                                  Offline                                   
dnj-4000.1                                                     Offline                                 
6040.1                                                         Offline                        
m225.02                                                        Offline                                  
5225.01                                                        Offline    

如何在30分钟内检查打印机是否处于脱机状态?我可以在文本文件中输出日志记录或smth?我所需要的只是"如何做到"。稍后我将配置电子邮件通知等。但我对PowerShell中的日志记录和解析一无所知。

2 个答案:

答案 0 :(得分:0)

如果您每半小时将这些结果输出到文本文件,则可以使用Compare-Object报告2个文件之间的差异/相似之处:

$file1 = get-childitem -path "C:\Powershell\Test\Text" | sort LastWriteTime | select -ExpandProperty FullName -last 2 | Out-File C:\Powershell\path1.txt
$file2 = Get-Content -Path "C:\Powershell\path1.txt" | Select-Object -First 1
$file3 = Get-Content -Path "C:\Powershell\path1.txt" | Select-Object -Last 1
Compare-Object -ReferenceObject (Get-Content $file2) -DifferenceObject (Get-Content $file3) -IncludeEqual -ExcludeDifferent | sort InputObject     

在此,List1.txt包含:

Xerox wc275.1                                                  Offline                                   
dnj-4000.1                                                     Offline                                 
6040.1                                                         Offline                        
m225.02                                                        Offline                                  
5225.01                                                        Offline

List2.txt包含:

Xerox wc275.1                                                  Offline                                   
dnj-4000.1                                                     Online
6040.1                                                         Offline                        
m225.02                                                        Offline                                  
5225.01                                                        Online

因此,结果给出了与之前30分钟相同的行:

PS C:\WINDOWS\system32> C:\Powershell\Test\CompareMostRecentFiles.ps1

InputObject                                                                                                      SideIndicator                                                                                                  
-----------                                                                                                      -------------                                                                                                  
6040.1                                                         Offline                                           ==                                                                                                             
m225.02                                                        Offline                                           ==                                                                                                             
Xerox wc275.1                                                  Offline                                           ==                                                                                                             

注意:

这将检查特定文件夹中的2个最新文件,因此如果您每30分钟运行一次打印机检查并导出到文本文件,请确保将文本文件输出到他们自己的特定文件夹,不包含任何其他内容,否则您将无法获得正确的结果。您还需要确保您的打印机检查脚本创建唯一的文本文件,并且不会覆盖相同的文本文件。

答案 1 :(得分:0)

使用无限循环完成它。

    $printers = @{}

Get-WmiObject -Class Win32_Printer | 
ForEach-Object {
    $printers[$_.Name] = $_ |
    Select-Object Name,DetectedErrorState,@{Name='PreviousStatus';Expression={$_.DetectedErrorState}},@{Name='StatusTime';Expression={0}}
}

Do {
    $check = Get-WMIObject -Class Win32_Printer
    ForEach($printer in $check) {
        If($printers[$printer.Name].DetectedErrorState -ne $printer.DetectedErrorState) {
            $printers[$printer.Name].PreviousStatus = $printers[$printer.Name].DetectedErrorState
            $printers[$printer.Name].DetectedErrorState = $printer.DetectedErrorState
            $printers[$printer.Name].StatusTime = 0
        } Else {
            $printers[$printer.Name].StatusTime += 1
        }
    }
    Start-Sleep 60
} While ($True)

非常感谢Mr.Crff这个想法。