应用于多个远程服务器的 Get-Printer cmdlet

Get-Printer cmdlet applied to multiple remote servers

我正在尝试 运行 cmdlet“Get-Printer”并将其应用于多台计算机,但我收到一条错误消息我尝试使用双引号并收到相同的错误消息。

“Get-Printer:无法处理参数 'ComputerName' 的参数转换。无法将值转换为类型 System.String。”“=18=]

Get-Printer -ComputerName 'server01', 'server02'|select-object -Property Name, PortName |Select-String -Pattern 127.0.0.1

是因为get-printer cmdlet 一次只能应用于一台服务器吗?我是否必须采用不同的方法才能将其应用于多个服务器?

Get-Printer的帮助显示参数-ComputerName接受字符串类型的输入,但不接受字符串数组。因此您只能指定一个计算机名称。 https://docs.microsoft.com/en-us/powershell/module/printmanagement/get-printer?view=windowsserver2019-ps

然而,您可以做的是先定义计算机名称数组,然后使用 foreach。

$computers = "server01","server02"
foreach($computer in $computers)
{
    Get-Printer -ComputerName $computer |select-object -Property Name, PortName | Select-String -Pattern 127.0.0.1
} 

或者就像 Jesse 在上面建议的那样,一个衬里看起来像这样:

"server01","server02" | ForEach-Object {Get-Printer -ComputerName $_} | Select-Object -Property Name, PortName | Select-String -Pattern 127.0.0.1 

ComputerName 是字符串而不是数组。请参阅 Get-Printer.

的文档

然而,您可以在开头使用另一个管道 (|),然后是一个以 % 开头的块(shorthand for ForEach-Object)以便提供一次一个 cmdlet 的字符串。它看起来像这样:

'server01', 'server02' | 
    %{Get-Printer -ComputerName $_} | 
    Select-Object -Property Name, PortName |
    Select-String -Pattern 127.0.0.1

虽然这还有第二个问题。 Select-String 也需要一个字符串,但您传递给它的是一个包含 NamePortName 的对象。您可以不使用 Select-String,而是将其通过管道传输到以 ? 为前缀的块(shorthand 表示 Where-Object)并检查 PortName 是否包含 127.0.0.1 .

添加这个看起来像:

'server01', 'server02' | 
    %{Get-Printer -ComputerName $_} | 
    Select-Object -Property Name, PortName |
    ?{$_.PortName.Contains("127.0.0.1")}

如果您愿意,也可以将 Select-Object 缩短为 Select,但我会留给您。