PowerShell打印机Ping监控脚本表格格式输出问题求助
解决方案
直接修改代码,通过创建自定义对象存储打印机名称和状态,再用Format-Table输出结构化表格。以下是调整后的完整代码:
# 获取AD中的打印机对象,仅选择需要的属性(提升查询效率) $printers = Get-AdObject -Filter "objectCategory -eq 'printqueue'" -Properties name, portName | Select-Object name, portName # 循环监控逻辑 Do { $downcount = 0 # 存储监控结果的数组 $monitorResults = @() # 遍历每个打印机 foreach ($printer in $printers) { $hostname = $printer.portName if ($hostname.Length -gt 0) { # 测试打印机端口主机的连通性 $isOnline = Test-Connection -ComputerName $hostname -Count 1 -ErrorAction SilentlyContinue # 确定状态文本 $status = if ($isOnline) { "在线" } else { "离线" } if (-not $isOnline) { $downcount++ } # 创建自定义对象,关联打印机名称与状态 $resultObj = [PSCustomObject]@{ PrinterName = $printer.name Status = $status } $monitorResults += $resultObj } } # 清屏后输出监控结果 Clear-Host Write-Host "打印机监控结果 $(Get-Date)" -ForegroundColor Cyan $monitorResults | Format-Table PrinterName, Status -AutoSize # 输出离线打印机计数 Write-Host "`n离线打印机数量: $downcount" -ForegroundColor ($downcount -gt 0 ? 'Red' : 'Green') # 等待下一轮检测 Write-Host -NoNewline "等待下一次检测" for ($s=0; $s -le 6; $s++) { Write-Host -NoNewline "." Start-Sleep 5 } Write-Host "" } while ($true)
关键改动说明
- 精简AD查询:去掉
Select-Object -Property *,仅获取name(打印机名称)和portName(待检测主机),减少不必要的资源占用。 - 结构化存储结果:用
[PSCustomObject]创建包含PrinterName和Status的对象,这是实现表格输出的核心——只有结构化对象才能被Format-Table正确解析成列。 - 关联打印机与状态:直接遍历AD打印机对象,同时保留打印机名称和对应端口的映射,解决原代码仅输出端口主机、丢失打印机原名的问题。
- 优化输出体验:每次循环前清屏,让表格展示更整洁;保留离线计数和等待提示,兼顾监控实用性。
内容的提问来源于stack exchange,提问作者user13741386
相关产品推荐
相关产品推荐

