将列表项转换为网格视图

时间:2018-11-20 08:10:56

标签: powershell

我想要所有安装了修补程序的服务器的矩阵/表格视图。我查询每台服务器,并得到如下列表:

host1, fix1
host1, fix2
host1, fix3
host2, fix1
host3, fix1
host3, fix2

理想情况下,我的网格如下所示:

HOSTS, fix1, fix2, fix3
host1, Yes, Yes, Yes
host2, Yes, No, No
host3, Yes, Yes, No

我认为我应该创建几个循环,但是我通常会这样一行:

$row = "" | Select Name, item1, item2

但是,在这种情况下,运行脚本之前我不知道项数。如何动态调整$ row的大小?

*****编辑***** 由Mathias R. Jessen创建了此版本的脚本:

$ListOfAllHotfixes = @()
$fixesOnHosts = @()
$totalview = @()
$hyplist = Get-SCVMHostCluster -Name "CLH-LGF-CTX"  | Get-SCVMHost

foreach( $hyphost in $hyplist)
{
    $hotfixlist = Get-HotFix -ComputerName $hyphost  # Per host a list off installed hotfixes
    Foreach( $hotfix in $hotfixlist)
    {
        # Create list of just hotfixes to compare to later on
        $ListOfAllHotfixes += $hotfix.hotfixid 
    # Create rows of hotfixes per host
    $Row = "" | Select hostname, hotfix
    $row.hostname = $hotfix.PSComputerName
    $row.hotfix = $hotfix.HotFixID

    $FixesOnHosts += $row }
}

# $ListOfAllHotfixes is now filled with all fixes per host, let's make it unique on hotfixid
$ListOfAllHotfixes = ($ListOfAllHotfixes | Sort-Object -Unique)

# Result = $FixesOnHosts = all hosts and all their hotfixes
# Result = $ListOffAllHotfixes = unique list of the hotfixes

$HotfixesPerHost = @{}
foreach($Hotfix in $FixesOnHosts)
{
  $HotfixesPerHost[$Hotfix.Hostname] += @($Hotfix.Hotfix)
  write-host "Host = "  $Hotfix.Hostname
  write-host "Hotfix = " $hotfix.hotfix 
}


foreach($HypHost in $HotfixesPerHost.Keys)
{
  $Properties = [ordered]@{ Hostname = $HypHost }
  foreach($Hotfix in $ListOfAllHotfixes)
  {
    $Properties[$Hotfix] = $HotfixesPerHost[$HypHost] -contains $Hotfix
  }
  [pscustomobject]$Properties
}

但是结果是这样的:

Hostname  : VCDHYP636
KB2843630 : True
KB2868626 : True
KB2883200 : True
KB2887595 : True
KB2893294 : True

(25行修补程序)

Hostname  : VCDHYP609
KB2843630 : False
KB2868626 : False
KB2883200 : False
KB2887595 : False
KB2893294 : False
KB2894852 : True
KB2894856 : True

1 个答案:

答案 0 :(得分:3)

要查找需要指定多少个单独的属性(或“列”),请先查找所有不同的修补程序-您可以使用Sort-Object进行此操作:

$Hotfixes = @'
host1, fix1
host1, fix2
host1, fix3
host2, fix1
host3, fix1
host3, fix2
'@ |ConvertFrom-Csv -Header Hostname,Hotfix

$DistinctHotfixes = $Hotfixes.Hotfix |Sort-Object -Unique

现在我们知道了要为每个主机创建的属性,我们只需要一种简单的方法就可以确定给定主机是否安装了特定的修补程序。

我们可以通过按主机名组织所有条目来轻松地做到这一点:

$HotfixesPerHost = @{}
foreach($Hotfix in $Hotfixes){
  $HotfixesPerHost[$Hotfix.Hostname] += @($Hotfix.Hotfix)
}

现在我们只需要为“矩阵”生成对象列表:

foreach($Hostname in $HotfixesPerHost.Keys){
  $Properties = [ordered]@{
    Hostname = $Hostname
  }
  foreach($Hotfix in $DistinctHotfixes){
    $Properties[$Hotfix] = $HotfixesPerHost[$Hostname] -contains $Hotfix
  }
  [pscustomobject]$Properties
}

最后我们得到了一个不错的主机列表,这些主机通过管道传输到Format-Table时如下所示:

Hostname fix1  fix2  fix3
-------- ----  ----  ----
host3    True  True False
host1    True  True  True
host2    True False False