Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

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
GELÖST

Powershell 2 DataTable Daten mergen

Frage Entwicklung Batch & Shell

Mitglied: H41mSh1C0R

H41mSh1C0R (Level 3) - Jetzt verbinden

11.10.2017 um 15:52 Uhr, 163 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: Kokosnuss
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: Kokosnuss
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: Kokosnuss
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
gelöst Powershell DataTable DataView (4)

Frage von H41mSh1C0R zum Thema Batch & Shell ...

Visual Studio
Sortierung von DataTable nach Select aufgelöst (1)

Frage von ForgottenRealm zum Thema Visual Studio ...

Batch & Shell
gelöst Powershell Jobs Parallel Ergebnis in DataTable mag bei GUI nicht ohne gehts

Frage von H41mSh1C0R zum Thema Batch & Shell ...

Neue Wissensbeiträge
Virtualisierung

Docker Monitoring und Steuerung per "sen"

Tipp von Frank zum Thema Virtualisierung ...

Viren und Trojaner

Neues Botnetz über IoT-Geräte

(6)

Information von certifiedit.net zum Thema Viren und Trojaner ...

Ubuntu

Ubuntu 17.10 steht zum Download bereit

(3)

Information von Frank zum Thema Ubuntu ...

Heiß diskutierte Inhalte
Windows Installation
Windows 10 neu installieren (17)

Frage von imebro zum Thema Windows Installation ...

Router & Routing
Externe IP von innen erreichbar machen (15)

Frage von Windows10Gegner zum Thema Router & Routing ...

Windows 7
Abbruch bei Brennvorgang (12)

Frage von Simulant zum Thema Windows 7 ...