我想要所有安装了修补程序的服务器的矩阵/表格视图。我查询每台服务器,并得到如下列表:
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
答案 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