【问题标题】:Get-Printer cmdlet applied to multiple remote servers应用于多个远程服务器的 Get-Printer cmdlet
【发布时间】:2021-12-02 15:30:35
【问题描述】:

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

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

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

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

【问题讨论】:

  • ComputerName 是字符串而不是数组。你必须单独做每一个。请参阅Get-Printer的文档
  • 谢谢。我知道采用不同的方法意味着它可能需要更高级的编码,我该如何完成?我几乎没有学习,我在网上找不到很多关于如何将其应用于多台服务器的信息
  • 您可以在开始时使用另一个管道。试试'server01', 'server02' | %{Get-Printer -ComputerName $_}
  • 你的代码也很有魅力,谢谢。

标签: powershell printing


【解决方案1】:

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

但是,您可以在开头使用另一个管道 (|),后跟以 %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,而是将其通过管道传输到以?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,但我会留给您。

【讨论】:

  • 你的代码行也很有魅力 谢谢。关于如何或在哪里可以学习如何正确构建您的代码的任何建议?现在我只是在处理单个字符串并遇到障碍,比如我今天发现的那个。
  • 主要是要熟悉不同的类型以及它们的功能。首先研究数组、字符串、整数和布尔值,然后再研究复杂类型,如列表和字典。之后,您真正需要的是熟悉常见的 cmdlet,如 Where-ObjectForEach-ObjectSelect-Object 等。还要研究 pipes 的工作原理。您可以将它们与任何命令一起使用,包括上面提到的那些。
  • 对于更复杂的编程,您需要知道变量、for 循环和 foreach 循环是如何工作的,但在您掌握数组并知道原始使用类型(字符串、整数、布尔值)。
【解决方案2】:

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 

【讨论】:

  • 让我试着想出一些我会很快发布编辑的东西。谢谢
  • 你的代码就像一个魅力我从未尝试过我仍在学习的方法,有时我发现很难找到正确的方法或如何正确地构造字符串。您对如何或在哪里学习设置字符串数组有什么建议吗?
  • 如果我理解正确,您想知道如何确定是否可以使用数组或单个字符串。最好是通过执行“help get-printer -Parameter computername”来查看 CmdLet 帮助。输出显示参数“ComputerName”将接受类型为“”(单个)的输入。如果参数接受一个数组,它将显示“”。
  • 对不起,如果我没有正确解释自己,我只是想学习编写代码或结构的正确方法,就像我知道的 foreach 一样,但我不知道如何像你这样做的方式
猜你喜欢
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 2017-11-08
  • 1970-01-01
相关资源
最近更新 更多