我想检查几个特定服务器的特定服务,并希望输出显示在同一格式化的表中。我只能创建多个表,或者只显示以我想要的方式格式化的最后一个表。我的目的是在同一张桌子上显示所有内容。
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
但是这样就创建了两个不同的表格,而不是像我想的那样只有一个表格中的所有信息。
我需要检查六个不同服务器上的不同服务,但只有两个我认为足以说明我在这个脚本上遇到的困难。
答案 0 :(得分:2)
你可以这样做:
# 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
答案 1 :(得分:2)
您的示例不会产生所需的结果,因为对于第一个示例,仅第二个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-Service
循环中运行ForEach-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
答案 2 :(得分:1)
如果您希望它们都显示在一个表格中,则需要同时将所有结果发送到Format-Table
。如果你两次致电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
在你走进这个兔子洞之前,请记住,Format-Table仅用于查看控制台中的内容。例如,您不能使用FT
创建表,然后将其导出为.csv。如果您只是在控制台中查看它就可以了,这应该可行。
答案 3 :(得分:1)
您可以简单地使用子表达式将两个输出整理为单个Format-Table,而不是填充数组或ArrayList:
$(
get-service "ServiceA", "ServiceB", "ServiceC" -computername SERVER1
get-service "ServiceD", "ServiceE", "ServiceF" -computername SERVER2
) | Format-Table -Property MachineName, Status, Name, DisplayName -auto