2017-01-30 4 views
1

Das spezifische Problem, das ich versucht bin zu lösen mit einer Liste von VMs und ihren Wirten, die ich mit PowerCLI abgeleitet, aber ich denke, das ist eine Frage, die sein könnte allgemein nach einer Liste von Powershell-Objekten gefragt.Powershell: Objekte in einer Liste auf andere Objekte in derselben Liste Vergleich

Ich habe eine Liste von Objekten und deren Eigenschaften. Ich möchte jedes Objekt in dieser Liste mit allen anderen Objekten in dieser Liste vergleichen und sehen, welche dieser VMs diese Eigenschaft gemeinsam haben.

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

Gibt es eine relativ einfache Art und Weise durch die Liste dann durchlaufen und jeweils Objekte zu jedem anderen Objekt in dieser Liste vergleichen und sehen, welche eine identische Eigenschaft „VMHost“ Objekte haben? Die meisten der Fragen, die ich gefunden habe, sind über den Vergleich von zwei Arrays von Objekten, aber ich bin mir nicht sicher, ob das hier hilft.

Das Endziel ist es, einen Bericht zu erstellen, die VMs, deren Namen hebt eine bestimmte Zeichenfolge übereinstimmen und einen Host teilen, so dass sie manuell überprüft werden kann und bewegt Hosts auf andere, wenn nötig.

+2

'| Gruppenobjekt -property VMHost'? – 4c74356b41

+0

Ja, Gruppenobjekt war der beste Weg dies zu tun. – Coxswain

Antwort

2

im Auge behalten das Endziel, landete ich mit dem Follow-up:

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

habe ich dann die $ x .count Variable, um zu bestimmen, ob die VMs einen Host geteilt. Dazu habe ich überprüft, ob den Gruppen, die mit dem Befehl Group-Object erstellt wurden, mehr als ein Objekt zugewiesen wurde (wenn die Anzahl> 1 war), und dann basierend darauf eine Ausgabe generiert.

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

Dies ließ mich den Bericht erzeugen, den ich brauchte. Es gibt wahrscheinlich einen besseren Weg, dies zu tun, aber das funktionierte ziemlich gut für das, was ich brauchte (ein schnell-und-dreckiger E-Mail-Bericht, der täglich ausgeführt und bei Bedarf getestet wurde).

2

Von here:

$b = $a | select –unique 

Compare-object –referenceobject $b –differenceobject $a 

Wählt die einzigartigen Objekte vergleicht dann, dass zur vollständigen Liste so können Sie überprüfen, was über nicht kopiert wurde.

Verwandte Themen