none
Powershell Hashtable Headeranpassung RRS feed

  • 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     XXXXX

    Damit 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.

    Mittwoch, 8. Mai 2019 14:17

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

    http://evgenij.smirnov.de

    Donnerstag, 9. Mai 2019 16:01

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
    Mittwoch, 8. Mai 2019 14:25
  • 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

    http://evgenij.smirnov.de


    Mittwoch, 8. Mai 2019 14:42
  • 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?

    Mittwoch, 8. Mai 2019 14:51
  • 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''

    Mittwoch, 8. Mai 2019 15:09
  • 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/

    Mittwoch, 8. Mai 2019 15:13
  • 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

    http://evgenij.smirnov.de

    Mittwoch, 8. Mai 2019 15:39
  •  2. Hashtabel (Daten aus CSV)

    Büro    Straße            Benutzer   Name
    ----    ------               -------    ----
    XXX    XXX                 XXXXX     XXXXX

    Hierbei 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

    Donnerstag, 9. Mai 2019 13:57
  • 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

    http://evgenij.smirnov.de

    Donnerstag, 9. Mai 2019 16:01