Powershell:将列表中的对象与同一列表中的其他对象进行比较

时间:2017-01-30 13:54:25

标签: powershell

我试图解决的具体问题是我使用powercli导出的VM及其主机列表,但我认为这是一个可以更普遍地询问任何powershell对象列表的问题。

我有一个对象列表及其属性。我想将该列表中的每个对象与该列表中的所有其他对象进行比较,并查看哪些VM具有该属性的共同点。

$vms = Get-VM | Where-Object {$_.Name -like '*vma*'} | Select Name, VMHost

是否有一种相对简单的方法可以遍历列表并将每个对象与该列表中的每个其他对象进行比较,并查看哪些对象具有相同的“VMHost”属性?我发现的大多数问题都是关于比较两个对象数组,但我不确定这有什么帮助。

最终目标是生成一个报告,突出显示名称与特定字符串匹配并共享主机的VM,以便可以手动检查它们并在需要时将其移动到其他主机。

2 个答案:

答案 0 :(得分:2)

来自here

$b = $a | select –unique

Compare-object –referenceobject $b –differenceobject $a

选择唯一对象,然后将其与完整列表进行比较,以便检查未复制的内容。

答案 1 :(得分:2)

牢记最终目标,我最终得到了以下内容:

$vms = Get-VM | Where-Object {$_.Name -like '*vma*'} | Select Name, VMHost
$groupedvms = $vms | Group-Object -Property VMHost

然后我使用$ x .count变量来确定VM是否共享主机。我这样做是通过检查Group-Object命令创建的组是否有多个对象分配给它们(如果计数是> 1),然后根据它生成输出。

foreach ($vmgroup in $groupedvms) {
    if ($vmgroup.count -ne 1) { [...] }
    else { [...] }
}

这让我生成我需要的报告。这可能是一种更好的方法,但这对我需要的东西非常有用(每天运行一个快速和脏的电子邮件报告,并在需要时进行分类)。