我尝试在Powershell中创建多个表的联合,以用户友好的格式作为报告输出,类似于SQL中的UNION
查询。
我有以下代码:
$ft = @{auto=$true; Property=@("MachineName", "Status", "Name", "DisplayName")}
$hosts = @("svr001", "svr002")
$report = @()
ForEach ($h in $hosts) {
$results = Get-Service -CN $h -Name MyService
$report += $results | Format-Table @ft
# Other things occur here, which is why I'm creating $report for output later.
}
Write-Output $report
此代码的输出如下:
MachineName Status Name DisplayName
----------- ------ ---- -----------
svr001 Running MyService MyServiceDisplayName
MachineName Status Name DisplayName
----------- ------ ---- -----------
svr002 Running MyService MyServiceDisplayName
因为您只需添加数组以在Powershell中执行联合(即,
$union = @(0, 1, 2) + @(3, 4, 5)
),我最初的想法是我应该
得到以下输出:
MachineName Status Name DisplayName
----------- ------ ---- -----------
svr001 Running MyService MyServiceDisplayName
svr002 Running MyService MyServiceDisplayName
回想起来,我想我明白为什么我不得到这个输出,但是我是 不知道如何从第一个输出示例创建两个表的并集到第二个表中的单个表,并且我无法在网上找到任何可以向我发送正确方向的文档或示例中的任何内容
答案 0 :(得分:2)
将Format-Table
移动到最后一个命令。 Format-*
cmdlet会创建您无法手动处理的特殊格式对象,因此保存它们毫无意义。将Format-*
的结果保存到数组时,您将保存“报告”,这就是输出中有两个表的原因(数组包含两个报告)。
首先收集数据,然后在要显示结果时使用Format-Table
。
$ft = @{auto=$true; Property=@("MachineName", "Status", "Name", "DisplayName")}
$hosts = @("svr001", "svr002")
$report = @()
ForEach ($h in $hosts) {
$results = Get-Service -ComputerName $h -Name MyService
$report += $results
# Other things occur here, which is why I'm creating $report for output later.
}
#Write-Output is not necessary as it is default behaviour
$report | Format-Table @ft
示例输出(使用wuauserv
作为服务名称):
MachineName Status Name DisplayName
----------- ------ ---- -----------
localhost Stopped wuauserv Windows Update
frode-pc Stopped wuauserv Windows Update
答案 1 :(得分:0)
Get-Service
Cmdlet还支持-ComputerName
参数的字符串数组。这对我有用:
Get-Service -CN $hosts -Name MyService | Format-Table @ft
使用wuauserv输出示例:
MachineName Status Name DisplayName
----------- ------ ---- -----------
Tim-SRV1 Running wuauserv Windows Update
Tim-SRV2 Stopped wuauserv Windows Update