Powershell 获取格式表以正确使用多个源

Powershell 获取格式表以正确使用多个源,powershell,tabular,Powershell,Tabular,我想检查几个特定服务器的特定服务,并希望输出显示在相同的格式化表上。我只能创建多个表,或者只显示我想要的格式的最后一个表。我的意图是在同一张桌子上展示所有内容 Get-Service "ServiceA", "ServiceB", "ServiceC" -ComputerName SERVER1 Get-Service "ServiceD", "ServiceE", "ServiceF" -ComputerName SERVER2 | Format-Table -Property

我想检查几个特定服务器的特定服务,并希望输出显示在相同的格式化表上。我只能创建多个表,或者只显示我想要的格式的最后一个表。我的意图是在同一张桌子上展示所有内容

Get-Service "ServiceA", "ServiceB", "ServiceC" -ComputerName SERVER1   
Get-Service "ServiceD", "ServiceE", "ServiceF" -ComputerName SERVER2 |
    Format-Table -Property MachineName, Status, Name, DisplayName -Auto
如何将SERVER1和SERVER2包含在同一个格式化表中?上面的示例仅显示SERVER2的格式化表

我试过的另一种方法是

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
但是这样就创建了两个不同的表,并且不是所有的信息都像我想的那样只在一个表中


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

您可以这样做:

# 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
$servers  = 'SERVER1', 'SERVER2'
$services = 'ServiceA', 'ServiceB', 'ServiceC'

Get-Service $services -ComputerName $servers |
    Format-Table -Property MachineName, Status, Name, DisplayName -AutoSize
$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
或者像这样:

# 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
$servers  = 'SERVER1', 'SERVER2'
$services = 'ServiceA', 'ServiceB', 'ServiceC'

Get-Service $services -ComputerName $servers |
    Format-Table -Property MachineName, Status, Name, DisplayName -AutoSize
$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

如果希望它们都显示在一个表中,则需要同时将所有结果发送到
格式表
。如果两次调用
Format 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    

在您深入这个兔子洞之前,请记住格式表只用于在控制台中查看内容。例如,您不能将使用
FT
制作的表作为.csv发送并导出。不过,如果您只想在控制台中查看它,这应该可以

无需填充数组或ArrayList,只需使用子表达式将两个输出整理为一个格式表:

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

您的示例不会产生期望的结果,因为对于第一个示例,只有第二个
Get Service
的输出进入
格式表
,对于第二个示例,创建了两个单独的表

如果查看
Get-Service
cmdlet的,您会注意到
-Name
-ComputerName
都使用字符串数组作为输入,因此,如果要在所有计算机上检查相同的服务,只需执行以下操作:

# 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
$servers  = 'SERVER1', 'SERVER2'
$services = 'ServiceA', 'ServiceB', 'ServiceC'

Get-Service $services -ComputerName $servers |
    Format-Table -Property MachineName, Status, Name, DisplayName -AutoSize
$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
如果您想检查每台服务器上的不同服务,我会使用哈希表将这些服务映射到服务器

$services = @{
    'SERVER1' = 'ServiceA', 'ServiceB', 'ServiceC'
    'SERVER2' = 'ServiceD', 'ServiceE', 'ServiceF'
}
并在
ForEach对象
循环中运行
Get Service
,如下所示:

# 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
$servers  = 'SERVER1', 'SERVER2'
$services = 'ServiceA', 'ServiceB', 'ServiceC'

Get-Service $services -ComputerName $servers |
    Format-Table -Property MachineName, Status, Name, DisplayName -AutoSize
$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
或者像这样:

# 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
$servers  = 'SERVER1', 'SERVER2'
$services = 'ServiceA', 'ServiceB', 'ServiceC'

Get-Service $services -ComputerName $servers |
    Format-Table -Property MachineName, Status, Name, DisplayName -AutoSize
$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

(获取服务“ServiceA”、“ServiceB”、“ServiceC”-computername SERVER1)+(获取服务“serviceed”、“ServiceE”、“ServiceF”-computername SERVER2)| ft可以工作。我已经使用了您的第一个示例,它按预期工作:)我可以问您另一个问题吗?使用您给出的第一个示例,我如何给输出上色,红色表示停止,绿色表示运行?PS控制台并不是这样使用的。相反,我建议您将结果导出到Excel或HTML,在那里您可以很好地格式化内容。
$s
不应该是
$services
?是的,您是对的!忘记将其更改回此处发布。使用您的示例,我可以对输出进行颜色编码吗?比如红色代表停止,绿色代表跑步?如果是,怎么做?很抱歉,如果这是一个很难回答的问题,但我在这里真的迈出了很小的一步。不是天生的,但这里有一个很好的函数,你可以添加到你的脚本中,使表着色!