poshniete
Goto Top

PowerShell Objekt Properties ersetzen - hinzufügen - ergänzen

Hallo zusammen,

vielleicht könnt ihr mir weiterhelfen. Ich glaube, ich habe mir gerade einen Knoten in den Kopf gedacht und bekomme ihn aktuell nicht entfernt. face-smile

Folgendes Szenario:
Ich habe zwei CSV-Dateien, die ich jeweils in eine Variable lade. ($ApplicationData & $WorkerGroupData).

In $ApplicationData habe ich unter anderem die Properties "Servers" und "WorkerGroups".
In $WorkerGroupData habe ich unter anderem die Properties "WorkerGroupName" und "ServerName".

Ich möchte jetzt für jeden Eintrag in $ApplicationData prüfen, ob "Servers" leer ist, wenn "Servers" leer ist, soll überprüft werden, ob "WorkerGroups" auch leer ist. Ist "WorkerGroups" nicht leer, soll der Inhalt aus "WorkerGroups" mit dem Inhalt aus $WorkerGroupData.WorkerGroupName" verglichen werden. Wenn das identisch ist, sollen alle gelieferten "$WorkerGroupData.ServerName" in "$ApplicationData.Servers" eingetragen möglich. Mehrere "Servers" pro "$ApplicationData"-Datensatz sind möglich.

Habt ihr einen Lösungsansatz für mich?

Beste Grüße,

die PoShNiete

Content-Key: 280086

Url: https://administrator.de/contentid/280086

Ausgedruckt am: 29.03.2024 um 11:03 Uhr

Mitglied: 114757
114757 13.08.2015 um 12:55:19 Uhr
Goto Top
Compare-Object face-wink

Gruß jodel32
Mitglied: PoShNiete
PoShNiete 13.08.2015 aktualisiert um 13:08:27 Uhr
Goto Top
Danke für deine Antwort! Ich sehe noch nicht wie mir das helfen kann. face-smile
Mitglied: TlBERlUS
TlBERlUS 13.08.2015 aktualisiert um 13:53:51 Uhr
Goto Top
Vermutlich sowas ala

$a = Get-Content .\Desktop\graph.csv
$b = Get-Content .\Desktop\graph2.csv
$comp = Compare-Object $a $b | ?{$_.Sideindicator -eq "<="} | select -ExpandProperty SideIndicator   

Grüße,

Tiberius

Edit: Hab mal kurz gebastelt

clear-host
$ApplicationDatacsv = gc ".\Desktop\applicationdata.csv"  
$WorkerGroupDatacsv = gc ".\Desktop\workergroupdata.csv"  
$app=@()
$Work = @()

foreach($w in $WorkerGroupDatacsv){
$w=$w.split(";")  
$Work += $w[1]
}

$i=0
foreach($a in $ApplicationDatacsv){
$a = $a.Split(";")  
if ($a -eq ""){  
$a = $Work[$i]
}
$i++
$app += $a
}
$app

Ist zwar vermutlich umständlich, hilft aber evtl. als Ansatz
Mitglied: PoShNiete
PoShNiete 13.08.2015 aktualisiert um 14:18:28 Uhr
Goto Top
Hi Tiberius,

vielen Dank für deine Antwort! Bislang sah mein Ansatz eher so aus:

foreach ($AD in $AppData) 
{
    $tmpServers = $null
    if ([string]::IsNullOrEmpty($AD.Servers)) 
    {
        if (![string]::IsNullOrEmpty($AD.WorkerGroups)) 
        {
            foreach ($WD in $WorkerData)
            {
                if ($AD.Servers -eq $WD.WorkerGroups)
                {
                $tmpServers = $tmpServers + $WD.ServerName
                }
            }
            $AD.Servers = $tmpServers
        }  
    }
}

Das funktioniert aber noch nicht ganz. *am Kopf kratz*
Mitglied: TlBERlUS
TlBERlUS 13.08.2015 um 14:19:02 Uhr
Goto Top
Zitat von @PoShNiete:

Hi Tiberius,

vielen Dank für deine Antwort! Bislang sah mein Ansatz eher so aus:

[code]
...
[/code]
Code-Tags funktionieren mit < >
Das funktioniert aber noch nicht ganz. *am Kopf kratz*

wenn ich den Code übernehme funktioniert da nichts
Mitglied: TlBERlUS
TlBERlUS 13.08.2015 aktualisiert um 14:53:23 Uhr
Goto Top
clear-host

#Pfade der csv-Dateien
$ApplicationDatacsv = gc ".\Desktop\applicationdata.csv"  
$WorkerGroupDatacsv = gc ".\Desktop\workergroupdata.csv"  
#Erstellung leerer Arrays
$app=@()
$Work = @()

#Nimmt den Inhalt der CSV-Dateie(Workergroup), spaltet die Strings bei ; und legt sie in ein Array
foreach($w in $WorkerGroupDatacsv){
$w=$w.split(";")  
$Work += $w[1]
}

#Counter
$i=0

#Nimmt den Inhalt der CSV-Dateie(Appdata), spaltet die Strings bei ; 
foreach($a in $ApplicationDatacsv){
$a = $a.Split(";")  
#Wenn $a(Serverspalte(zumindestens bei mir)) ohne Eintrag dann setze $a mit der entsprechenden Stelle aus $workerkeroup gleich
if ($a -eq ""){  
$a = $Work[$i]
}
#hochzählen des Counters
$i++
<#Hier müssen die restlichen Spalten angefügt werden#>
#Fügt Spalte a(Servername) und Spalte b (Anwendung) zusammen
$app += $a+";"+$a[1]  
}
#Erstelle eine 2. text-Datei, in der die aktualisierten Daten liegen
$app | out-file .\Desktop\applicationdata_2.csv

Damit sollte es funktionieren.

P.S. Wobei mich @114757 ´s Ansatz auch interessieren würde, da er vermutlich einfacher ist.

Edit: Beschreibungen
Mitglied: PoShNiete
PoShNiete 13.08.2015 um 14:45:22 Uhr
Goto Top
Ausprobiert und damit funktioniert nichts. face-smile

Ich weiß aber auch noch nicht, ob wir nicht aneinander vorbei reden. So 100%ig blicke ich deinen Code aber auch noch nicht.
Mitglied: TlBERlUS
TlBERlUS 13.08.2015 aktualisiert um 14:55:57 Uhr
Goto Top
Hab nochmal Beschreibungen eingefügt.

Du musst das ganze natürlich auf deine Bedürfnisse anpassen.
Lass es mal in der Powershell-ISE durchlaufen und poste das Ergebnis

Btw. "nichts" ist etwas unaussagekräftig.

P.S. ansonsten poste dochmal eine Beispielzeile aus deinen Csv´s
Mitglied: PoShNiete
PoShNiete 13.08.2015 um 15:29:39 Uhr
Goto Top
Mein Konstrukt weiter oben funktionierte. Habe nur zwei Properties vertauscht. Trotzdem danke für deine Mühe! face-smile
Mitglied: 114757
114757 13.08.2015 aktualisiert um 16:42:05 Uhr
Goto Top
Ich hab das so interpretiert...

Die zwei Variablen hab ich nur mal zur Funktionsdemo mit Daten gefüllt
$ApplicationData = @'  
Servers;WorkerGroups
Server01;Gruppe1
Server02;Gruppe2
;Gruppe22
Server05;Gruppe5
'@ | ConvertFrom-CSV -Delimiter ";"  

$WorkerGroupData = @'  
WorkergroupName;ServerName
Gruppe22;Server22
Gruppe22;Server23
GruppeX;Server33
GruppeY;ServerY
GruppeZ;ServerZ
'@ | ConvertFrom-CSV -Delimiter ";"  

$ApplicationData | ?{$_.Servers -eq "" -and $_.WorkerGroups -ne ""} | %{  
    $wGroup = $_.WorkerGroups
    $_.Servers += $WorkerGroupData | ?{$_.WorkerGroupName -eq $wGroup} | select -Expand ServerName
}
$ApplicationData

back-to-top$ApplicationData vor der "Behandlung"
Servers  WorkerGroups
-------  ------------
Server01 Gruppe1     
Server02 Gruppe2     
         Gruppe22    
Server05 Gruppe5 
und nach der Behandlung:
Servers           WorkerGroups
-------           ------------
Server01          Gruppe1     
Server02          Gruppe2     
Server22 Server23 Gruppe22    
Server05          Gruppe5  
Gruß jodel32