脚本完成后有两个变量,但是当我通过管道传输到 SELECT-object 时,只有第一个 returns 数据到控制台
Script has two variables when done, but when I pipe to SELECT-object only first one returns data to console
我正在尝试使用 WMI 查询多台服务器,但我并不总是能够访问这些服务器。
代码如下。 las,它 returns 对控制台“访问被拒绝”,但我似乎无法摆脱它。好吧。
但是,我 捕获了我无法连接的服务器,以便我可以告诉其他人查看它们或请求访问。
但是当我运行代码时,它只有returns第一个服务器列表;即使 $failed_servers 有值,也不会返回任何内容。如果我告诉两者都通过管道传输到 ogv,则会弹出两个 windows。
为什么“$variable|select”都不起作用?如果我删除 $failed_servers 上的 select,它就会显示出来,尽管它紧挨着成功的那些。这还可以,但不是很好。
$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={$_}}
您遇到的只是一个显示问题:
你的Select-Object
calls produce output objects with 4
or fewer properties whose types do not have explicit formatting data associated with them (as reported by Get-FormatData
).
这会导致 PowerShell 的显示输出 formatting system to implicitly render them via the Format-Table
cmdlet。
Format-Table
使用的 显示列 锁定在 基于 非常Format-Table
收到的第一个对象 。
因此,您的 second Select-Object
调用,其输出对象 不共享任何属性 与第一个输出的对象,有效地产生 no visible output - 然而,对象 are 发送到成功输出流和可用于程序化处理。
一个简单的演示:
& {
# 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-Object
管道通过管道传输到 Out-Host
以强制即时、特定于管道的格式,但是 -鉴于结果直接发送到 host 而不是成功输出流 - 这种技术 排除了进一步的编程处理 .
未来可能的改进:
GitHub issue #7871 建议如果输出对象实际上变得不可见,至少发出 警告 。
我正在尝试使用 WMI 查询多台服务器,但我并不总是能够访问这些服务器。
代码如下。 las,它 returns 对控制台“访问被拒绝”,但我似乎无法摆脱它。好吧。
但是,我 捕获了我无法连接的服务器,以便我可以告诉其他人查看它们或请求访问。
但是当我运行代码时,它只有returns第一个服务器列表;即使 $failed_servers 有值,也不会返回任何内容。如果我告诉两者都通过管道传输到 ogv,则会弹出两个 windows。
为什么“$variable|select”都不起作用?如果我删除 $failed_servers 上的 select,它就会显示出来,尽管它紧挨着成功的那些。这还可以,但不是很好。
$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={$_}}
您遇到的只是一个显示问题:
你的
Select-Object
calls produce output objects with4
or fewer properties whose types do not have explicit formatting data associated with them (as reported byGet-FormatData
).这会导致 PowerShell 的显示输出 formatting system to implicitly render them via the
Format-Table
cmdlet。Format-Table
使用的 显示列 锁定在 基于 非常Format-Table
收到的第一个对象 。因此,您的 second
Select-Object
调用,其输出对象 不共享任何属性 与第一个输出的对象,有效地产生 no visible output - 然而,对象 are 发送到成功输出流和可用于程序化处理。
一个简单的演示:
& {
# 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-Object
管道通过管道传输到Out-Host
以强制即时、特定于管道的格式,但是 -鉴于结果直接发送到 host 而不是成功输出流 - 这种技术 排除了进一步的编程处理 .
未来可能的改进:
GitHub issue #7871 建议如果输出对象实际上变得不可见,至少发出 警告 。