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
?是的,您是对的!忘记将其更改回此处发布。使用您的示例,我可以对输出进行颜色编码吗?比如红色代表停止,绿色代表跑步?如果是,怎么做?很抱歉,如果这是一个很难回答的问题,但我在这里真的迈出了很小的一步。不是天生的,但这里有一个很好的函数,你可以添加到你的脚本中,使表着色!