2017-01-30 2 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 

Затем я использовал .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 

Выбор уникальных объектов, а затем сравнивает его с полным списком, так что вы можете проверить, что не копируется.