Benutzer mit den meisten Antworten
Powershell Hashtable Headeranpassung

Frage
-
Hallo zusammen,
bin dabei eine Inventarisierung von PCs im Netzwerk zu schreiben. Dabei soll eine AD-Abfrage (Hashtable aus CSV) mit den ausgelesenen Daten vom PC (Hashtable aus TXT) mit verschiedenen Formaten zusammengefügt werden.
1. Hashtabelle (Daten aus Textdatei):
Name Value
---- -----
InstallDate XX-XX-XXXX
MAC_Ethernet XX-XX-XX-XX
Model_PC XXXXXXX
RAM XXXX
CPU XXXX
Host XXXX
OS XXXX
SN_PC XXXX
2. Hashtabel (Daten aus CSV)
Büro Straße Benutzer Name
---- ------ ------- ----
XXX XXX XXXXX XXXXXDamit ich diese zusammenfügen kann sollte die Erste statt den Headern Name und Value die Werte InstallDate, MAC_Ethernet, Model_PC usw vorweisen. Gibt es da eine Möglichkeit oder muss ich mir da einen komplett anderen Weg suchen?
Vielen Dank im Vorraus.
Antworten
-
Moin,
naja, wenn Du dann mit dem PSCustomObject weiter arbeiten willst, dann kannst Du ja die Elemente asu der Hashtable ihm mit Add-Member hinzufügen:
$ht.GetEnumerator() | foreach { $obj | Add-Member -MemberType NoteProperty -Name $_.Name -Value $_.Value }
Evgenij Smirnov
- Als Antwort markiert Dominik Hartl Freitag, 10. Mai 2019 13:20
Alle Antworten
-
Gibt es da eine Möglichkeit oder muss ich mir da einen komplett anderen Weg suchen?
Es gibt IMMER irgendeine Möglichkeit ... ;-) ... wie, welchen anderen Weg? ... zeig doch mal den Weg, den Du schon hast!
So als Schnellschuß ad hoc würde ich ein [PSCustomObject] in einem nested loop empfehlen.
Live long and prosper!
(79,108,97,102|%{[char]$_})-join''
- Bearbeitet BOfH-666 Mittwoch, 8. Mai 2019 14:26
-
Moin,
Du kannst die Elemente einer Hashtable sowohl in der Indexschreibweise als auch in der Objektschreibweise ansprechen:
$ht1 = @{field1=1;field2="zwo"} $ht2 = @{field3="three";field4=4} $ht1.field1 $ht1['field2'] $ht1 + $ht2
EDIT: Ich vermute mal, dass die CSV-Daten keine Hashtable, sondern ein CustomObject ist. Das müsstest Du noch konvertieren:
$ht3 = @{} $obj.PSObject.Properties | Foreach { $ht3[$_.Name] = $_.Value }
Evgenij Smirnov
- Bearbeitet Evgenij Smirnov Mittwoch, 8. Mai 2019 14:47
-
Hätte es an der Wurzel angepackt. Statt die Daten der PCs in eine txt-Datei zu schreiben hätte ich sie in eine CSV gepackt, aber habe das vorgehen noch nicht weiter verfolgt, da ich txt im Vorteil sehe.
Erzeugt wird die Hashtable-Variable wie folgt:
$PCInfo = [System.Collections.Hashtable]@{
Host = $ImportPCZuordnung[0]
Model_PC = $ImportPCZuordnung[1]
SN_PC = $ImportPCZuordnung[2]
OS = $ImportPCZuordnung[3]
InstallDate = $ImportPCZuordnung[4]
RAM = $ImportPCZuordnung[5]
MAC_Ethernet = $ImportPCZuordnung[6]
CPU = $ImportPCZuordnung[7]
}Ich muss zugeben, dass ich im Moment noch nicht wirklich weiß wie ich an die Sache rangehen soll.
Habe zwar schon recherchiert, aber nur Beiträge zur Umbenennung von Headern über Funktionen mit Parametern gefunden. Leider aber noch nicht wie man neue Header hinzufügt und diese benennt.Ja eine nested loop würde Sinn machen, aber wie gesagt ich weiß nicht wie ich Powershell das mit den neuen Headern sagen soll. Könntest du mir da weiterhelfen?
-
Hashtable aus TXT - gibt es da pro PC eine TXT Datei? Wie wird denn das erzeugt? Ist es vielleicht einfacher an der Stelle der Erzeugung der Daten anzusetzen? Wenn es eine Datei pro PC gibt, könnte man eventuell erstmal aus den Daten der einzelnen TXT Dateien eine Tabelle bauen und diese dann weiterzuverarbeiten?
Oder bin ich wieder mal auf'm Holzweg und hab alles falsch verstanden? ;-=
Live long and prosper!
(79,108,97,102|%{[char]$_})-join''
-
Was verstehst du unter Header?
Eine Hashtable besteht immer aus einer liste Key/Value-Pair's.
https://www.windowspro.de/script/hash-table-powershell-erzeugen-elemente-hinzufuegen-loeschen-sortieren
Was ist also genau dein Problem und was für "Header" willst du ändern?
Du kannst natürlich auch eine HCashtable mittels Key einer anderen Hashtable zuweisen.
Du kannst auch eigene "Objekte" erstellen:https://www.active-directory-faq.de/2015/12/powershell-custom-objekte/
-
Hätte es an der Wurzel angepackt. Statt die Daten der PCs in eine txt-Datei zu schreiben hätte ich sie in eine CSV gepackt, aber habe das vorgehen noch nicht weiter verfolgt, da ich txt im Vorteil sehe.
Erzeugt wird die Hashtable-Variable wie folgt:
$PCInfo = [System.Collections.Hashtable]@{
Host = $ImportPCZuordnung[0]
Model_PC = $ImportPCZuordnung[1]
SN_PC = $ImportPCZuordnung[2]
OS = $ImportPCZuordnung[3]
InstallDate = $ImportPCZuordnung[4]
RAM = $ImportPCZuordnung[5]
MAC_Ethernet = $ImportPCZuordnung[6]
CPU = $ImportPCZuordnung[7]
}Ich muss zugeben, dass ich im Moment noch nicht wirklich weiß wie ich an die Sache rangehen soll.
Habe zwar schon recherchiert, aber nur Beiträge zur Umbenennung von Headern über Funktionen mit Parametern gefunden. Leider aber noch nicht wie man neue Header hinzufügt und diese benennt.Ja eine nested loop würde Sinn machen, aber wie gesagt ich weiß nicht wie ich Powershell das mit den neuen Headern sagen soll. Könntest du mir da weiterhelfen?
Wie wäre es mit (nach dem obigen Block, aus dem Du übrigens [System.Collections.Hashtable] rausschmeißen kannst, da @{} eh eine Hashtable ist):
$PCInfo.Büro = $PCInfoAusTXT.Büro $PCInfo.Straße = $PCInfoAusTXT.Straße ...usw...
? ;-)
Evgenij Smirnov
-
2. Hashtabel (Daten aus CSV)
Büro Straße Benutzer Name
---- ------ ------- ----
XXX XXX XXXXX XXXXXHierbei handelt es sich nicht wie von mir erwartet um ein Hashtable sondern wie Evgenij Smirnov gesagt hat um ein CustomObject.
Die Weiterverarbeitung mit den Daten in diesem Format finde ich angenehm und habe ich auch schon getestet, deshalb würde ich gerne den echten Hashtable aus der txt-Datei in ein CustomObject umwandeln wollen und diese dann zusammenfügen.
Mfg Dominik
-
Moin,
naja, wenn Du dann mit dem PSCustomObject weiter arbeiten willst, dann kannst Du ja die Elemente asu der Hashtable ihm mit Add-Member hinzufügen:
$ht.GetEnumerator() | foreach { $obj | Add-Member -MemberType NoteProperty -Name $_.Name -Value $_.Value }
Evgenij Smirnov
- Als Antwort markiert Dominik Hartl Freitag, 10. Mai 2019 13:20