Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Frage Entwicklung Batch & Shell

GELÖST

Powershell 2 DataTable Daten mergen

Mitglied: H41mSh1C0R

H41mSh1C0R (Level 3) - Jetzt verbinden

11.10.2017 um 15:52 Uhr, 224 Aufrufe, 6 Kommentare

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.

01.
$TableName = "DataTable" 
02.
 
03.
$global:table = New-Object system.Data.DataTable "$TableName" 
04.
 
05.
$col0 = New-Object system.Data.DataColumn Name, ([bool]) 
06.
$col1 = New-Object system.Data.DataColumn Beschreibung, ([string]) 
07.
 
08.
$global:table.columns.add($col0) 
09.
$global:table.columns.add($col1) 
10.
     
11.
$row = ($false, "xxx-W-CM19","","","") 
12.
$global:table.Rows.Add($row) 
13.
$row = ($false, "xxx-W-CM15","","","") 
14.
$global:table.Rows.Add($row) 
15.
     
16.
$DC = ( Get-ADDomainController -Discover -DomainName <Domain>).HostName[0] 
17.
$Servers = Get-ADComputer ` 
18.
     -Server $DC ` 
19.
     -Filter {(OperatingSystem -like '*Server*' -and Name -like '*-W-CM1*')}` 
20.
     -Properties Name, Description 
21.
 
22.
$global:ServerData = $Servers ` 
23.
   | Select -Property ` 
24.
     Name, ` 
25.
     Description ` 
26.
    | Sort Name  
27.
 
28.
$global:ServerData | %{   
29.
    $Name = $_.Name 
30.
 
31.
    $zwischen = $global:table.where({$_.ServerName -eq $Name }) 
32.
    $zwischen[0].Beschreibung = $_.Description  
33.
}
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
Mitglied: 134464
11.10.2017, aktualisiert um 16:22 Uhr
$_.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
Bitte warten ..
Mitglied: H41mSh1C0R
11.10.2017 um 17:42 Uhr
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.

01.
$global:ServerData | %{   
02.
    $Name = $_.Name 
03.
 
04.
    $zwischen = $global:table.where({$_.Name -eq $Name }) 
05.
    $zwischen[0].Beschreibung = $_.Description  
06.
}
ServerName gibt es in der table nicht aber Name.
Trotzdem meckert er immernoch die Eigenschaft "Beschreibung" an, das es sie nicht gibt.

01.
$col0 = New-Object system.Data.DataColumn Name, ([bool]) 
02.
$col1 = New-Object system.Data.DataColumn Beschreibung, ([string])
Die Eigenschaft gibt es allerdings. ;(
Bitte warten ..
Mitglied: H41mSh1C0R
12.10.2017, aktualisiert um 10:13 Uhr
hmmmmm

Ich versuche das gerade mal weiter herunterzubrechen.

Einlesen der Daten aus dem AD:
01.
$DC = ( Get-ADDomainController -Discover -DomainName <Domain> ).HostName[0] 
02.
$Servers = Get-ADComputer ` 
03.
     -Server $DC ` 
04.
     -Filter {(OperatingSystem -like '*Server*' -and Name -like '*-W-CM1*')}` 
05.
     -Properties Created, Name, DNSHostName, IPv4Address, OperatingSystem, Description, CanonicalName | Select-Object ` 
06.
     -Property Name,Description | sort Name 
07.
 
08.
$Servers
Ergebnis:
01.
Name       Description                                                                    
02.
----       -----------                                                                    
03.
AAA-W-CM16 Standort A 
04.
BBB-W-CM18 Standort B 
05.
CCC-W-CM14 Standort C 
06.
DDD-W-CM12 Standort D 
Soweit so gut.

Jetzt die Dummy Tabelle erzeugen:
01.
$TableName = "DataTableDummy" 
02.
 
03.
$global:tableZiel = New-Object system.Data.DataTable "$TableName" 
04.
 
05.
$col0 = New-Object system.Data.DataColumn Auswahl, ([bool]) 
06.
$col1 = New-Object system.Data.DataColumn Name, ([string]) 
07.
$col2 = New-Object system.Data.DataColumn Beschreibung, ([string]) 
08.
 
09.
$global:tableZiel.columns.add($col0) 
10.
$global:tableZiel.columns.add($col1) 
11.
$global:tableZiel.columns.add($col2) 
12.
     
13.
$row = ($false, "AAA-W-CM16","") 
14.
$global:tableZiel.Rows.Add($row) 
15.
$row = ($false, "CCC-W-CM14","") 
16.
$global:tableZiel.Rows.Add($row)
Führe ich den Dummy Block alleine aus bekomme ich folgende Ausgabe:

01.
Auswahl Name       Beschreibung 
02.
------- ----       ------------ 
03.
  False AAA-W-CM16              
04.
  False CCC-W-CM14             
Soweit so Gut.

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

01.
Name       Description                                                                    
02.
----       -----------                 
03.
AAA-W-CM16 Standort A 
04.
BBB-W-CM18 Standort B 
05.
CCC-W-CM14 Standort C 
06.
DDD-W-CM12 Standort D                                   
07.
AAA-W-CM16                                                                                
08.
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.

;(
Bitte warten ..
Mitglied: 134464
LÖSUNG 12.10.2017, aktualisiert um 10:18 Uhr
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!
Bitte warten ..
Mitglied: 134464
LÖSUNG 12.10.2017, aktualisiert um 10:34 Uhr
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
01.
$dt = New-Object System.Data.DataTable 
02.
$dt.Columns.Add("Name") | out-null 
03.
$dt.Columns.Add("Alter")| out-null 
04.
$dt.Rows.Add(("Maria",55))| out-null 
05.
$dt.Rows.Add(("Max",39))| out-null 
06.
$dt.Columns.Add("Gehalt")| out-null 
07.
 
08.
# Geht nicht weil du nur die Variable und nicht die Datarow veränderst! 
09.
$r = $dt.Rows.Where({$_.Name -eq "Max"}) 
10.
$r[0].Gehalt = 10000 
11.
 
12.
# Geht weil du dir Datarow direkt veränderst! 
13.
$dt.Rows.Where({$_.Name -eq "Max"}) | %{$_.Gehalt = 2500} 
14.
 
15.
$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.
Bitte warten ..
Mitglied: H41mSh1C0R
12.10.2017 um 12:02 Uhr
Läuft. =)

Danke dir für die Hilfe.

Er überträgt nun die Beschreibung(was nur exemplarisch die Auswahl war):
01.
     
02.
$DC = ( Get-ADDomainController -Discover -DomainName <Domain> ).HostName[0] 
03.
$Servers = Get-ADComputer ` 
04.
     -Server $DC ` 
05.
     -Filter {(OperatingSystem -like '*Server*' -and Name -like '*-W-CM1*')}` 
06.
     -Properties Created, Name, DNSHostName, IPv4Address, OperatingSystem, Description, CanonicalName | Select-Object ` 
07.
     -Property Name,Description | sort Name  
08.
 
09.
# ------------------------------------- Ende Einlesen aus AD ------------------------------------- 
10.
 
11.
$TableName = "DataTableDummy" 
12.
$global:tableZiel = New-Object system.Data.DataTable "$TableName" 
13.
 
14.
$col0 = New-Object system.Data.DataColumn Auswahl, ([bool]) 
15.
$col1 = New-Object system.Data.DataColumn Name, ([string]) 
16.
$col2 = New-Object system.Data.DataColumn Beschreibung, ([string]) 
17.
 
18.
$global:tableZiel.columns.add($col0) 
19.
$global:tableZiel.columns.add($col1) 
20.
$global:tableZiel.columns.add($col2) 
21.
 
22.
$global:tableZiel.Rows.Add($false, "AAA-W-CM16","") | Out-Null 
23.
$global:tableZiel.Rows.Add($false, "CCC-W-CM14","") | Out-Null 
24.
 
25.
 
26.
# ------------------------------------- Ende Dummy Table ------------------------------------- 
27.
 
28.
foreach($Eintrag in $Servers){ 
29.
    $NameAusServers = $Eintrag.Name 
30.
    $NeuerInhaltBeschreibung = $Eintrag.Description 
31.
 
32.
    $global:tableZiel.Rows.Where({$_.Name -eq $NameAusServers}) | %{$_.Beschreibung = "$NeuerInhaltBeschreibung"} 
33.
34.
 
35.
$global:tableZiel 
36.
 
37.
# ------------------------------------- Ende eintragen der Beschreibung in Dummy Table ------------
Ausgabe:
01.
Auswahl Name       Beschreibung                  
02.
------- ----       ------------                  
03.
  False AAA-W-CM16 Standort A 
04.
  False CCC-W-CM14 Standort C             
VG
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Powershell DataTable DataView
gelöst Frage von H41mSh1C0RBatch & Shell4 Kommentare

Hi in die Runde, ich habe ein DataGridView. An dieses habe ich eine DataTable gehängt. Jetzt möchte ich Spalten ...

Batch & Shell
PowerShell String zerlegen in Array, DataTable, Hashtable speichern
gelöst Frage von derhoeppiBatch & Shell7 Kommentare

Guten Morgen, leider habe wieder ein Thema beim zerlegen eines Strings. Folgendes Problem: Die Rückgabe eines Admintools liefert mir ...

Samba
Export-Import tdbsam (mergen von 2 Samba-Nutzerdatenbanken)
Frage von SKIP250Samba2 Kommentare

Liebe Community, nachdem ich diesen Account während der Ausbildung erstellt, jedoch nicht genutzt habe, möchte ich mich jetzt mit ...

Visual Studio
Sortierung von DataTable nach Select aufgelöst
Frage von ForgottenRealmVisual Studio1 Kommentar

Moinmoin, ich habe mehrere DataTables die ich beim Programmstart lade und die Daten im Hintergrund halte, um später darauf ...

Neue Wissensbeiträge
Linux

Meltdown und Spectre: Linux Update

Information von Frank vor 2 StundenLinux

Meltdown (Variante 3 des Prozessorfehlers) Der Kernel 4.14.13 mit den Page-Table-Isolation-Code (PTI) ist nun für Fedora freigegeben worden. Er ...

Tipps & Tricks

Solutio Charly Updater Fehlermeldung: Das Abgleichen der Dateien in -Pfad- mit dem Datenobject ist fehlgeschlagen

Tipp von StefanKittel vor 20 StundenTipps & Tricks

Hallo, hier einmal als Tipp für alle unter Euch die mit der Zahnarztabrechnungssoftware Charly von Solutio zu tun haben. ...

Sicherheit

Meltdown und Spectre: Wir brauchen eine "Abwrackprämie", die die CPU-Hersteller bezahlen

Information von Frank vor 21 StundenSicherheit12 Kommentare

Zum aktuellen Thema Meltdown und Spectre: Ich wünsche mir von den CPU-Herstellern wie Intel, AMD oder ARM eine Art ...

Sicherheit

Meltdown und Spectre: Realitätscheck

Information von Frank vor 22 StundenSicherheit9 Kommentare

Die unangenehme Realität Der Prozessorfehler mit seinen Varianten Meltdown und Spectre ist seit Juni 2017 bekannt. Trotzdem sind immer ...

Heiß diskutierte Inhalte
Windows 10
Netbook erkennt Soundkarte nicht - keinerlei Info zum Hersteller und Modell vom Netbook und Hardware bekannt
Frage von 92943Windows 1031 Kommentare

Guten Tag, meine Schwester reist in einigen Wochen für ein paar Monate ins Ausland und hat sich dafür ein ...

Netzwerkgrundlagen
Welches Modem für VDSL 50000 der T-Com
gelöst Frage von Windows10GegnerNetzwerkgrundlagen21 Kommentare

Hallo, ein Kollege von mir will sich VDSL50000 von der T-Com holen, um daran einen Server zu betreiben. Ich ...

Sicherheit
Meltdown und Spectre: Die machen uns alle was vor
Information von FrankSicherheit18 Kommentare

Aktuell sieht es in den Medien so aus, als hätten die Hersteller wie Intel, Microsoft und Co den aktuellen ...

Netzwerke
Packet loss bei "InternetLeitungsvollauslastung"
gelöst Frage von Freak-On-SiliconNetzwerke17 Kommentare

Servus; Ja der Titel klingt komisch, is aber so. Wenn die Internetleitung voll ausgelastet ist, hab ich extreme packet ...