让 format-table 正确处理多个源

Getting format-table to work correctly with multiple sources

我想检查几个特定服务器的特定服务,并希望输出以相同的格式显示 table。我只能创建多个 table,或者只显示最后一个 table 的格式。我的意图是在同一个 table.

上显示所有内容
Get-Service "ServiceA", "ServiceB", "ServiceC" -ComputerName SERVER1   
Get-Service "ServiceD", "ServiceE", "ServiceF" -ComputerName SERVER2 |
    Format-Table -Property MachineName, Status, Name, DisplayName -Auto

如何在相同格式的 table 上包含 SERVER1 和 SERVER2?上面的例子只会显示 SERVER2 的格式化 table?

我试过的其他方法是

Get-Service "ServiceA", "ServiceB", "ServiceC" -ComputerName SERVER1 |
    Format-Table -Property MachineName, Status, Name, DisplayName -Auto
Get-Service "ServiceD", "ServiceE", "ServiceF" -ComputerName SERVER2 |
    Format-Table -Property MachineName, Status, Name, DisplayName -Auto

但这样会创建两个不同的 table,而不是像我希望的那样将所有信息都集中在一个中。

我需要在六台不同的服务器上检查不同的服务,但我认为只有两台就足以说明我在这个脚本上遇到的困难。

你可以这样做:

# create array
$services = @()

# add items to array
$services += Get-Service spooler
$services += Get-Service wsearch

# format array
$services | Format-Table -Property MachineName, Status, Name, DisplayName -AutoSize

或者像这样:

# create list
$services = New-Object System.Collections.ArrayList

# add items to list
$services.Add($(Get-Service spooler)) | Out-Null
$services.Add($(Get-Service wsearch)) | Out-Null

# display list
$services | Format-Table -Property MachineName, Status, Name, DisplayName -AutoSize

如果您希望它们都出现在一个 table 中,您需要同时将 所有 结果发送到 Format-Table。如果您调用 Format-Table 两次,您将得到两个单独的 table。

幸运的是,PowerShell 使得将命令的结果存储在变量中并稍后使用它变得非常容易。

您需要做的是创建一个变量来保存结果,然后将所有 Get-Service 命令存储在其中,如下所示:

#take the output and store it in $services
$services = get-service bits,winrm -computername ServerA
#add the output of the next to $services as well
$services += get-service AdobeARMservice,ALG -computername ServerB

#finally, make one big table to display it all
$services |Format-Table -Property MachineName, Status, Name, DisplayName -auto

MachineName  Status Name            DisplayName                              
-----------  ------ ----            -----------                              
ServerA     Running bits            Background Intelligent Transfer Service  
ServerA     Running winrm           Windows Remote Management (WS-Management)
ServerB     Running AdobeARMservice Adobe Acrobat Update Service             
ServerB     Stopped ALG             Application Layer Gateway Service    

在你深入这个兔子洞之前,请记住 Format-Table 仅用于在控制台中查看内容。例如,您不能使用 FT 制作的 table 然后将其导出为 .csv。如果您只在控制台中查看它就可以了,那么这应该可以工作。

无需填充数组或 ArrayList,您可以简单地使用 sub-expression 将两个输出整理成单个 Format-Table:

$(
  get-service "ServiceA", "ServiceB", "ServiceC" -computername SERVER1
  get-service "ServiceD", "ServiceE", "ServiceF" -computername SERVER2
) | Format-Table -Property MachineName, Status, Name, DisplayName -auto

您的示例没有产生预期的结果,因为对于第一个示例,只有第二个 Get-Service 的输出进入 Format-Table,而对于第二个示例,创建了两个单独的表。

如果您查看 Get-Service cmdlet 的 documentation,您会注意到 -Name-ComputerName 都将字符串数组作为输入, 所以如果你想在所有计算机上检查相同的服务,你可以简单地做这样的事情:

$servers  = 'SERVER1', 'SERVER2'
$services = 'ServiceA', 'ServiceB', 'ServiceC'

Get-Service $services -ComputerName $servers |
    Format-Table -Property MachineName, Status, Name, DisplayName -AutoSize

如果您想检查每台服务器上的不同服务,我会使用哈希表将服务映射到服务器

$services = @{
    'SERVER1' = 'ServiceA', 'ServiceB', 'ServiceC'
    'SERVER2' = 'ServiceD', 'ServiceE', 'ServiceF'
}

和 运行 Get-ServiceForEach-Object 循环中,像这样:

$services.Keys | ForEach-Object {
    Get-Service $services[$_] -ComputerName $_
} | Format-Table -Property MachineName, Status, Name, DisplayName -AutoSize

或者像这样:

$services.GetEnumerator() | ForEach-Object {
    Get-Service $_.Value -ComputerName $_.Name
} | Format-Table -Property MachineName, Status, Name, DisplayName -AutoSize