查询所有带有打印机端口的机器,例如“ * WSD *”

时间:2018-08-15 20:01:06

标签: powershell

我的域中的某些计算机安装了带有错误PortName的打印机。我有一个域中所有计算机的列表,并且可以使用\ p列出端口名称类似于WSD的计算机上的所有打印机。

Get-Printer -ComputerName $Computer | Where PortName -like "*WSD*"

但是我想让它在我的计算机列表中的每台计算机上运行,​​然后创建一个CSV或文本文件,并列出每台计算机的列表,其中每台计算机的打印机的端口名都不正确。

这是我到目前为止所拥有的:

$ComputerList = Get-Content "c:\Temp\Computers.CSV"  

    foreach ($Computer in $ComputerList) {

        $WSD = Get-Printer -ComputerName $Computer | Where PortName -like "*WSD*" }

我不太了解如何完成脚本来完成我想要的。如果我不清楚的地方请告诉我。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

首先,您应该使用.csvImport-Csv导入数据,以免标题出现问题。

第二,您步入正轨,但也许可以这样尝试:

$ComputerList = Import-Csv -Path "c:\Temp\Computers.CSV"
$WSD = @()

foreach ($Computer in $ComputerList.<EnterHeaderNameHere>)
{
  if (Get-Printer -ComputerName $Computer | Where-Object {$_.Portname -like "*WSD*"})
    {
      $WSD += $Computer
    }
}

这将检查查询结果是否返回命中,如果是,它将把ComputerName附加到数组$WSD

然后,您可以根据需要使用Out-FileExport-Csv将数组转发到文件。

例如:

$WSD | Out-File -Path "c:\Temp\WSD.txt"

答案 1 :(得分:0)

就像他说的那样,导入CSV很棒。由于get-printer接受逗号分隔的列表(如字符串<string[]>后方括号中的帮助所示),因此您可以过度简化它。

$ComputerList = import-csv "c:\Temp\Computers.CSV"  
$WSD = Get-Printer -ComputerName $Computerlist.name | Where {$_.PortName -like "*WSD*" }

如果csv列的标题为“ name”,则变量后的.name仅会吐出计算机名称,因此您可以更改列表以使标题为“ name”。或更改您的代码,并将其从.name更改为字段的实际名称。

在这种情况下foreach循环的优点是您可以将命令作为作业运行。然后,当所有作业完成时,您可以将数据导出到$ wsd。但这是完全不同的写作。

如果您希望将其保存在文件中,则将

$wsd | out-file c:\temp\computerlist.txt -append

或者只是从脚本中删除变量wsd,然后将主命令通过管道传递到文件外