2016-05-16 75 views
0

我有一个脚本,通过WMI检查所有打印服务器中所有打印机的状态。结果如下所示:如何检查打印机是否处于30分钟以上的状态?

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

如何检查打印机是否脱机30分钟?我可以把输出放在文本文件中进行记录或扫描?我需要的是“如何做到”。稍后我会配置电子邮件通知等,但我不知道在PowerShell中记录和解析。

+0

每隔x分钟检查一次状态,如果您在总共30分钟内获得相同的状态(“脱机”),也许您可​​以认为该状态在该段时间内处于脱机状态。刷新间隔30分钟可能会有点长(打印机可能在该时间段内联机和脱机)。 – sodawillow

+0

它只是一个简单的状态。不管它是什么,离线,在线,错误或不适用。我只是想知道如何使用PowerShell来检查它。如果我每隔半分钟检查一次状态,不要认为这是个好主意。记住脱机打印机池并使用时间间隔检查它会更好吗? –

+0

如何知道30分钟内是否已脱机? –

回答

0

如果你输出这些结果到一个文本文件,每半小时,你可以用比较-对象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分钟检查并出口到文本文件,确保文本文件正在输出到他们自己的特定文件夹,不包含任何其他内容,否则您将得不到正确的结果。您还需要确保打印机检查脚本创建唯一的文本文件,并且不会覆盖同一文本文件。

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.Cduff这个想法。

相关问题