PowerShell zwei Array mit unterschiedlichem Inhalt vergleichen
Hallo,
folgende Aufgabe muss ich in einem Skript zur Administration eines Storagesystems lösen. Mit einem Befehl lese ich die im Storagesystem konfigurierten Hosts in ein Array $Array_Hosts. Im folgenden erstelle ich ein weiteres Array $Array_MapHosts, welches andere Spalten aufweist. Jedoch gibt es in beiden Arrays Informationen die sich verknüpfen lassen. So gibt es im $Array_Hosts die Spalten ID und Name, die im Array $Array_MapHosts host_id und host_name heißen. Eine dieser beiden Spalten muss ich vergleichen und die Hosts die die Differenz bilden in einer Listbox ausgeben.
Mit dem Befehl Compare-Object kann ich scheinbar nur eindimensionale Arrays vergleichen. Dazu habe ich viele Beispiele gefunden - habe es aber nicht auf meinen Anwendungsfall anpassen können bzw. es gab keinen Output.
Kann mir jemand einen Ansatz nennen, so dass ich es weiter versuchen kann?
Gruß
derhoeppi
folgende Aufgabe muss ich in einem Skript zur Administration eines Storagesystems lösen. Mit einem Befehl lese ich die im Storagesystem konfigurierten Hosts in ein Array $Array_Hosts. Im folgenden erstelle ich ein weiteres Array $Array_MapHosts, welches andere Spalten aufweist. Jedoch gibt es in beiden Arrays Informationen die sich verknüpfen lassen. So gibt es im $Array_Hosts die Spalten ID und Name, die im Array $Array_MapHosts host_id und host_name heißen. Eine dieser beiden Spalten muss ich vergleichen und die Hosts die die Differenz bilden in einer Listbox ausgeben.
Mit dem Befehl Compare-Object kann ich scheinbar nur eindimensionale Arrays vergleichen. Dazu habe ich viele Beispiele gefunden - habe es aber nicht auf meinen Anwendungsfall anpassen können bzw. es gab keinen Output.
Kann mir jemand einen Ansatz nennen, so dass ich es weiter versuchen kann?
Gruß
derhoeppi
Please also mark the comments that contributed to the solution of the article
Content-Key: 267263
Url: https://administrator.de/contentid/267263
Printed on: April 19, 2024 at 18:04 o'clock
7 Comments
Latest comment
Moin,
vergleiche nicht die kompletten Arrays sondern nur die jeweiligen Spalten der Arrays.
D.h. also das du im Compare-CMDLet als Reference-Object $Array_Hosts.ID verwendest und als Difference-Object $Array_MapHosts.host_id nimmst, feddich.
Beispiel:
Gruß jodel32
vergleiche nicht die kompletten Arrays sondern nur die jeweiligen Spalten der Arrays.
D.h. also das du im Compare-CMDLet als Reference-Object $Array_Hosts.ID verwendest und als Difference-Object $Array_MapHosts.host_id nimmst, feddich.
Beispiel:
Set-StrictMode -Version 3
# Für das Beispiel Daten erzeugen ------------------------------
$arr1 = @()
$arr2 = @()
$arr1 += [pscustomobject] @{"ID"="100";"Name"="Sepp Meier"}
$arr1 += [pscustomobject] @{"ID"="101";"Name"="Max Muster"}
$arr1 += [pscustomobject] @{"ID"="102";"Name"="Henriette Musterfrau"}
$arr2 += [pscustomobject] @{"host_id"="100";"host_name"="Sepp Meier"}
$arr2 += [pscustomobject] @{"host_id"="101";"host_name"="Max Muster"}
$arr2 += [pscustomobject] @{"host_id"="102";"host_name"="Henriette Musterfrau"}
$arr2 += [pscustomobject] @{"host_id"="103";"host_name"="Florian Zusatz"}
# --------------------------------------------------------
# Vergleich
compare -ReferenceObject $arr1.id -DifferenceObject $arr2.host_id
Da ist ja auch alles durcheinander gewürfelt und lauter Flüchtigkeitsfehler drin....schau's die noch mal genau an.
min. PS 3.0//
Du machst immer den Fehler und schaust dir die Ausgabe der jeweiligen Befehle und deren Eigenschaften nicht exakt an.
Powerhell ist in dem Sinne Quasi schon eine Programmiersprache mit Objekten, Eigenschaften, etc. d.h. man muss schon mal schauen wie die jeweilige Ausgabe strukturiert ist. Dazu sind die CMDLets Get-Member, Format-List * etc. unerlässlich.
Einfach irgendein Objekt an ein anderes zu übergeben ohne das man weiß das diese zueinander kompatibel sind kann immer nur schief gehen !!
Gruß jodel32
min. PS 3.0//
$Difference = compare -ReferenceObject $arr1.id -DifferenceObject $arr2.host_id -passthru
$hosts = $arr2 | ?{$_.host_id -in $Difference} | Select -expand host_name
$ListBox.Items.Add($hosts)
Du machst immer den Fehler und schaust dir die Ausgabe der jeweiligen Befehle und deren Eigenschaften nicht exakt an.
Powerhell ist in dem Sinne Quasi schon eine Programmiersprache mit Objekten, Eigenschaften, etc. d.h. man muss schon mal schauen wie die jeweilige Ausgabe strukturiert ist. Dazu sind die CMDLets Get-Member, Format-List * etc. unerlässlich.
Einfach irgendein Objekt an ein anderes zu übergeben ohne das man weiß das diese zueinander kompatibel sind kann immer nur schief gehen !!
Gruß jodel32
Zitat von @derhoeppi:
kannst du mir zum Verständnis noch mitteilen wofür der Parameter -passthru im compare cmdlet dient?
Der gibt die ursprünglichen Objekte an die Pipe weiter, was ohne nicht der Fall ist. Schau dir die Ausgabe einfach mal mit und ohne Parameter an, dann siehst du den Unterschied kannst du mir zum Verständnis noch mitteilen wofür der Parameter -passthru im compare cmdlet dient?
Was du natürlich beachten musst ist das fehlende Objekte auf beiden Seiten aufgelistet werden! Wenn du das nicht willst und nur eine Seite betrachten willst musst du den SideIndicator auswerten und so die Ausgabe filtern.
Bspw. so:
$Difference = compare -ReferenceObject $arr1.id -DifferenceObject $arr2.host_id | ?{$_.SideIndicator -eq "=>"} | select -Expand InputObject
Zitat von @derhoeppi:
Um das Abzufangen würde ich jetzt eine eine if-else Bedingung vorstellen, die prüft, ob die Arrays leer sind und dementsprechend aggieren.
und warum tust du das nicht ? Keinen Plan ?Um das Abzufangen würde ich jetzt eine eine if-else Bedingung vorstellen, die prüft, ob die Arrays leer sind und dementsprechend aggieren.
if ($arr1 -and $arr2){
# Compare .........
}else{
# eins oder beide Arrays leer
}