h41msh1c0r
Goto Top

Powershell 2 DataTable Daten mergen

Hi in die Runde,

ich habe 2 DataTables, eine mit X Spalten und eine mit Y Spalten.
Der Inhalt von Spalte B in Tabelle 1 soll anhand eines Kriteriums in Spalte C von Tabelle 2.

Ich denke bestimmt wieder viiiiiiel zuviel um die Ecke, oder Kaffeemangel ^^.

Das Ganze unten ist der Versuch das herunterzubrechen.

$TableName = "DataTable"  

$global:table = New-Object system.Data.DataTable "$TableName"  

$col0 = New-Object system.Data.DataColumn Name, ([bool])
$col1 = New-Object system.Data.DataColumn Beschreibung, ([string])

$global:table.columns.add($col0)
$global:table.columns.add($col1)
    
$row = ($false, "xxx-W-CM19","","","")  
$global:table.Rows.Add($row)
$row = ($false, "xxx-W-CM15","","","")  
$global:table.Rows.Add($row)
    
$DC = ( Get-ADDomainController -Discover -DomainName <Domain>).HostName
$Servers = Get-ADComputer `
     -Server $DC `
     -Filter {(OperatingSystem -like '*Server*' -and Name -like '*-W-CM1*')}`  
     -Properties Name, Description

$global:ServerData = $Servers `
   | Select -Property `
     Name, `
     Description `
    | Sort Name 

$global:ServerData | %{  
    $Name = $_.Name

    $zwischen = $global:table.where({$_.ServerName -eq $Name })
    $zwischen.Beschreibung = $_.Description 
}

Das holen der Info Name und Description aus dem AD läuft.
Das Verheiraten der Beschreibung mit der $global:table in die Spalte Beschreibung noch nicht.

Hat einer eine Idee?
Aktuell ist er der Meinung die Spalte Beschreibung existiert nicht.

VG

Content-Key: 351413

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

Printed on: April 24, 2024 at 16:04 o'clock

Mitglied: 134464
134464 Oct 11, 2017 updated at 14:22:33 (UTC)
Goto Top
$_.ServerName
Die Spalte gibt es laut deinem Code in deiner Datatable nicht! So denn kann er auch nichts finden.

p.s. es gibt die Datatable.Merge Methode um Datatables zu aktualisieren/ergänzen
Member: H41mSh1C0R
H41mSh1C0R Oct 11, 2017 at 15:42:34 (UTC)
Goto Top
Das Merge habe ich extra nicht benommen, da ich ja nicht die Zeilen komplett übernehmen will sondern ja nur die Werte aus der Spalte von Tabelle A in eine Spalte von Tabelle B übernehmen will, und zwar in die richtige Zeile.

$global:ServerData | %{  
    $Name = $_.Name

    $zwischen = $global:table.where({$_.Name -eq $Name })
    $zwischen.Beschreibung = $_.Description 
}

ServerName gibt es in der table nicht aber Name.
Trotzdem meckert er immernoch die Eigenschaft "Beschreibung" an, das es sie nicht gibt.

$col0 = New-Object system.Data.DataColumn Name, ([bool])
$col1 = New-Object system.Data.DataColumn Beschreibung, ([string])

Die Eigenschaft gibt es allerdings. ;(
Member: H41mSh1C0R
H41mSh1C0R Oct 12, 2017 updated at 08:13:04 (UTC)
Goto Top
hmmmmm

Ich versuche das gerade mal weiter herunterzubrechen.

Einlesen der Daten aus dem AD:
$DC = ( Get-ADDomainController -Discover -DomainName <Domain> ).HostName
$Servers = Get-ADComputer `
     -Server $DC `
     -Filter {(OperatingSystem -like '*Server*' -and Name -like '*-W-CM1*')}`  
     -Properties Created, Name, DNSHostName, IPv4Address, OperatingSystem, Description, CanonicalName | Select-Object `
     -Property Name,Description | sort Name

$Servers

Ergebnis:
Name       Description                                                                   
----       -----------                                                                   
AAA-W-CM16 Standort A
BBB-W-CM18 Standort B
CCC-W-CM14 Standort C
DDD-W-CM12 Standort D 

Soweit so gut.

Jetzt die Dummy Tabelle erzeugen:
$TableName = "DataTableDummy"  

$global:tableZiel = New-Object system.Data.DataTable "$TableName"  

$col0 = New-Object system.Data.DataColumn Auswahl, ([bool])
$col1 = New-Object system.Data.DataColumn Name, ([string])
$col2 = New-Object system.Data.DataColumn Beschreibung, ([string])

$global:tableZiel.columns.add($col0)
$global:tableZiel.columns.add($col1)
$global:tableZiel.columns.add($col2)
    
$row = ($false, "AAA-W-CM16","")  
$global:tableZiel.Rows.Add($row)
$row = ($false, "CCC-W-CM14","")  
$global:tableZiel.Rows.Add($row)

Führe ich den Dummy Block alleine aus bekomme ich folgende Ausgabe:

Auswahl Name       Beschreibung
------- ----       ------------
  False AAA-W-CM16             
  False CCC-W-CM14             

Soweit so Gut.

Führe ich die beiden Blöcke oben zusammen aus schaut die Ausgabe noch anders aus:

Name       Description                                                                   
----       -----------                
AAA-W-CM16 Standort A
BBB-W-CM18 Standort B
CCC-W-CM14 Standort C
DDD-W-CM12 Standort D                                  
AAA-W-CM16                                                                               
CCC-W-CM14                                                                               

Die Ausgabe ist für mich überhaupt nicht nachvollziehbar. Müsste er nicht ZWEI Ausgaben machen?

Das Problem die Beschreibungen aus der ersten Ausgabe in die entsprechende Zellen der DummyTabelle zu bekommen besteht leider immernoch.

;(
Mitglied: 134464
Solution 134464 Oct 12, 2017 updated at 08:18:42 (UTC)
Goto Top
Die Ausgabe ist für mich überhaupt nicht nachvollziehbar. Müsste er nicht ZWEI Ausgaben machen?
Nein, wenn du es hinterander auf der Konsole ausgibst fasst die Shell das in der Anzeige zusammen, wie auch bei anderen Objekten mit ähnlichen Eigenschaften. Trotzdem bleiben es zwei separate Objekte, die Ausgabe täuscht dir hier nur was vor weil es zwei Objekte des selben Typs sind!
Mitglied: 134464
Solution 134464 Oct 12, 2017 updated at 08:34:56 (UTC)
Goto Top
Dein Code oben kann nicht funktionieren weil du die Row einer weiteren Variablen zuweist und damit nicht die Datatable selbst veränderst sondern nur die Eigenschaften innerhalb der Variablen! Jetzt klar ? Du musst die Datarow selbst direkt verändern.

Damit du siehst was ich meine hier ein kleines Beispiel
$dt = New-Object System.Data.DataTable
$dt.Columns.Add("Name") | out-null  
$dt.Columns.Add("Alter")| out-null  
$dt.Rows.Add(("Maria",55))| out-null  
$dt.Rows.Add(("Max",39))| out-null  
$dt.Columns.Add("Gehalt")| out-null  

# Geht nicht weil du nur die Variable und nicht die Datarow veränderst!
$r = $dt.Rows.Where({$_.Name -eq "Max"})  
$r.Gehalt = 10000

# Geht weil du dir Datarow direkt veränderst!
$dt.Rows.Where({$_.Name -eq "Max"}) | %{$_.Gehalt = 2500}  

$dt.Rows

Stell dir dir Objekte im Speicher vor, die Variabel ist ein ganz neues Objekt und gehört nicht der Datatable an. Es wäre was anderes wenn hier ein Pointer wie in C verwendet werden würde.
Member: H41mSh1C0R
H41mSh1C0R Oct 12, 2017 at 10:02:41 (UTC)
Goto Top
Läuft. =)

Danke dir für die Hilfe.

Er überträgt nun die Beschreibung(was nur exemplarisch die Auswahl war):
    
$DC = ( Get-ADDomainController -Discover -DomainName <Domain> ).HostName
$Servers = Get-ADComputer `
     -Server $DC `
     -Filter {(OperatingSystem -like '*Server*' -and Name -like '*-W-CM1*')}`  
     -Properties Created, Name, DNSHostName, IPv4Address, OperatingSystem, Description, CanonicalName | Select-Object `
     -Property Name,Description | sort Name 

# ------------------------------------- Ende Einlesen aus AD -------------------------------------

$TableName = "DataTableDummy"  
$global:tableZiel = New-Object system.Data.DataTable "$TableName"  

$col0 = New-Object system.Data.DataColumn Auswahl, ([bool])
$col1 = New-Object system.Data.DataColumn Name, ([string])
$col2 = New-Object system.Data.DataColumn Beschreibung, ([string])

$global:tableZiel.columns.add($col0)
$global:tableZiel.columns.add($col1)
$global:tableZiel.columns.add($col2)

$global:tableZiel.Rows.Add($false, "AAA-W-CM16","") | Out-Null  
$global:tableZiel.Rows.Add($false, "CCC-W-CM14","") | Out-Null  


# ------------------------------------- Ende Dummy Table -------------------------------------

foreach($Eintrag in $Servers){
    $NameAusServers = $Eintrag.Name
    $NeuerInhaltBeschreibung = $Eintrag.Description

    $global:tableZiel.Rows.Where({$_.Name -eq $NameAusServers}) | %{$_.Beschreibung = "$NeuerInhaltBeschreibung"}  
}

$global:tableZiel

# ------------------------------------- Ende eintragen der Beschreibung in Dummy Table ------------

Ausgabe:
Auswahl Name       Beschreibung                 
------- ----       ------------                 
  False AAA-W-CM16 Standort A
  False CCC-W-CM14 Standort C             

VG