脚本完成后有两个变量,但是当我通过管道传递到 SELECT-object 时,只有第一个变量将数据返回到控制台

Script has two variables when done, but when I pipe to SELECT-object only first one returns data to console

提问人:mbourgon 提问时间:9/16/2021 更新时间:12/16/2021 访问量:697

问:

我正在尝试使用 WMI 查询多个服务器,但我并不总是可以访问这些服务器。

代码如下。唉,它向控制台返回“访问被拒绝”,但我似乎无法摆脱它。那好吧。

但是,我正在捕获我无法连接到的服务器,以便我可以告诉其他人查看它们或请求访问权限。

但是当我运行代码时,它只返回第一个服务器列表;即使 $failed_servers 具有值,也不会返回任何内容。如果我告诉两者都通过管道连接到 ogv,则会弹出两个窗口。

为什么“$variable|select”都不起作用?如果我删除 $failed_servers 上的选择,它就会显示出来,尽管只是位于成功的选择的正下方。这很好,但不是很好。

$list = ("servera","serverb","serverc")
$failed_servers = @()
$final = foreach ($server_instance in $list)
{
$errors=@()
gwmi -query "select * from win32_service where name like '%SQLSERVER%'" -cn $server_instance -ErrorVariable +errors -ErrorAction SilentlyContinue
if ($errors.Count -gt 0) {$failed_servers += $server_instance
}
}

$final|select pscomputername, name, startmode, state |where {$_.pscomputername -ne $null}

$failed_servers |select @{N='Failed Servers'; E={$_}}
PowerShell 选择对象

评论


答:

4赞 mklement0 9/16/2021 #1

您遇到的只是一个显示问题

  • 这两个 Select-Object 调用都会生成具有 4 个或更少属性的输出对象,这些属性的类型没有与之关联的显式格式数据(如 Get-FormatData 报告的那样)。

  • 这会导致 PowerShell 的 for-display 输出格式设置系统通过 Format-Table cmdlet 隐式呈现它们。

  • Format-Table 使用的显示列是根据接收的第一个对象的属性锁定Format-Table

  • 因此,第二个 Select-Object 调用(其输出对象与第一个调用输出的对象不共享任何属性)实际上不会产生可见输出 - 但是,这些对象发送到成功的输出流,并可用于编程处理

一个简单的演示:

& {
  # This locks in Month and Year as the display columns of the output table.
  Get-Date   | Select-Object Month, Year
  # This command's output will effectively be invisible,
  # because the property set Name, Attributes does not overlap with
  # Month, Year
  Get-Item \ | Select-Object Name, Attributes
}

输出将如下所示 - 请注意第二个语句的输出实际上是不可见的(除了额外的空行):

Month Year
----- ----
    9 2021


请注意,该问题甚至可能影响输出不同类型对象(其类型没有关联的格式数据)的单个语句;例如:
(Get-Date | Select-Object Year), (Get-Item \ | Select-Object Name)


解决方法:

  • 应用到上述命令会使所有对象可见,但显然会更改显示格式。| Format-List

  • 在脚本中,你可以通过管道将每个管道传递到,以强制执行特定于管道的即时格式设置,但是,鉴于结果直接发送到主机而不是成功输出流,此技术排除了进一步的编程处理Select-ObjectOut-Host


未来可能改进:

GitHub issue #7871 建议,如果输出对象实际上变得不可见,至少会发出警告