2017-01-30 28 views
1

我试图解决的具体问题是使用Powercli导出的虚拟机及其主机的列表,但我认为这是一个可能存在的问题更普遍地询问任何列表的PowerShell对象。Powershell:将列表中的对象与同一列表中的其他对象进行比较

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

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

有一个比较简单的方法,然后遍历列表和每个对象比较在该列表中的每个其他物体,看看哪些对象具有相同的“VMHOST”属性?我发现的大多数问题都是关于比较两个对象数组的,但我不确定这有帮助。

最终目标是生成一份报告,其中突出显示名称与特定字符串匹配并共享主机的虚拟机,以便可以手动检查并根据需要移动到其他主机。

+2

'| | Group-Object -property VMHost'? – 4c74356b41

+0

是的,群组对象最终成为实现此目的的最佳方式。 – Coxswain

回答

2

牢记最终目标,我结束了以下内容:

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

然后我用了$ X .Count之间的变量来确定虚拟机共享一台主机。我通过检查由Group-Object命令创建的组是否具有多个分配给它们的对象(如果计数大于1)并基于此生成输出来完成此操作。

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

这让我生成我需要的报告。有可能有更好的方法来做到这一点,但这对我所需要的很好(一个快速而肮脏的电子邮件报告每天运行并在需要时进行分类)。

2

here

$b = $a | select –unique 

Compare-object –referenceobject $b –differenceobject $a 

选择唯一对象,然后比较,要完整列表,以便您可以检查什么不能复制。

相关问题