我的域中的某些计算机安装了带有错误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*" }
我不太了解如何完成脚本来完成我想要的。如果我不清楚的地方请告诉我。任何帮助将不胜感激。
答案 0 :(得分:0)
首先,您应该使用.csv
从Import-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-File
或Export-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,然后将主命令通过管道传递到文件外