none
Multi Array enthält nicht alle Daten RRS feed

  • Frage

  • Hallo,

    bin immer noch dabei ein Script für Inventarisierung von Hardware zu schreiben / erweitern und die Daten in einer Excel-Tabelle zu speichern.

    Da ich vorher nicht weiß, wie viele Netzwerkkarten, CPU's usw. ein Rechner aufweist, müssen die Spalten variabel sein. Das habe ich auch hinbekommen.

    # CPU Name des Computers auslesen
            $script:CPUs = Get-WmiObject Win32_Processor -ComputerName $ComputerName | Select-Object -ExpandProperty Name
            # Array mit Anzahl der CPUs pro Rechner erstellen
            $CPUsArray = @()
            $CPUsArray += $script:CPUs
            $script:CPUCounter += $CPUsArray.Count

    # Maximale Anzahl der verbauten Geräte ermitteln $CPUMax = $script:CPUCounter | Measure-Object -max | Select-Object -expand Maximum for($i=1; $i -le $CPUMax; $i++){ $ExlWorksheet.Cells.Item(1,$Col).Value2 = 'CPU'+$i $Col++

    }

    Soweit klappt das auch, jedoch habe ich Probleme beim Befüllen eines Multi-Arrays mit den Daten. Es sind danach nicht alle Datensätze vorhanden.

    # Jeden Rechner einzeln verarbeiten
    ForEach ($ComputerName in $ComputerNames) {
        $script:j++
        if(Test-Connection -ComputerName $ComputerName -Quiet -Count 1) {
            # wenn der Rechner per Ping erreichbar ist         
                    
            # Netzwerkkarte(n) des Rechners auslesen die eien IPAdresse haben        
            $Networks = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $ComputerName | Where-Object {$_.ipenabled -eq 'true'} 
            # Array mit der Anzahl der Netzwerkkarten pro Rechner erstellen
            $NetworksArray = @()
            $NetworksArray += $Networks
            $script:NetworkCounter += $NetworksArray.Count 
            
            # MultiArray mit allen Karten               
            $script:MultiNetwork += ,@($script:j, $Networks.IpAddress[0])
       
        } #end if
        else{            
            # wenn der Rechner nicht per Ping erreich bar ist           
            $script:MultiNetwork += ,@($script:j, 'Host nicht erreichbar')
            
                    
        } #end else
                
    } # end foreach Computer

    Lasse ich mir das Array $script:MultiNetwork ausgeben, fehlt z.B. mein eigener Rechner, der mehrere IP-Adressen hat.

    Für einen Rat, was ich falsch mache wäre ich Euch dankbar.

    Gruß Michael


    Gruß Michael

    Dienstag, 27. Januar 2015 10:50

Antworten

Alle Antworten

  • Hallo Michael,

    auf den ersten Blick sieht es so aus als wäre es ein Problem mit dem Befüllen des Arrays.

    Wie würde denn dein Wunschergebnis aussehen?

    Gruß,

    Heyko

    Dienstag, 27. Januar 2015 13:09
  • Hallo Michael!

    In der Variable $Networks können sich eine oder viele IPs befinden. Hier musst du mit einer ForEach Schleife arbeiten.
    ForEach ($Network in $Networks) {

    Wir hatten in dem folgend verlinkten Thread schon gemeinsam eine Lösung genau dafür erarbeitet, die dieses aufzeigt.:

    https://social.technet.microsoft.com/Forums/de-DE/22583d83-3d91-4578-a09b-d61a2895ef7c/ipadresse-und-dazugehrigen-hostnamen-in-excel-speichern

    Warum setzt du das nicht einfach wieder so um?

    Oder wie Heyko schon fragte, was willst du denn erreichen? Wie soll das Endergebnis aussehen?


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Dienstag, 27. Januar 2015 14:00
  • Hallo Heyko, Hallo Peter,

    ich danke Euch erst mal, dass Ihr mir helfen wollt. Zu der Frage, was ich als Ergebnis haben möchte:

    Als Ergebnis möchte ich eine dynamische Tabelle haben. Das heißt, ich habe z.B. ein Netzwerk mit Rechnern in dem ein PC/Server 2 CPU's, ein anderer 2 Festplatten und ein dritter 3 Netzwerkadapter hat, dann sollen z.B. die Überschriften (Spalten) CPU1, CPU2 - HDD1, HDD2 und LAN1, LAN2, LAN3 erzeugt werden. Das gelingt mir auch schon. Nur das Befüllen der Zellen darunter mit den entsprechenden Daten macht mir Probleme. Bei den PC's, die dann z.B. nur eine CPU haben könnte dann bei CPU2 z.B. nicht vorhanden stehen.

    An Peter: Leider bekomme ich das, was wir letzte mal erarbeitet haben nicht an die neuen Wünsche angepasst, bin ja immer noch PowerShell-Neuling.

    Danke schonmal.

    Gruß Michael


    Gruß Michael

    Montag, 2. Februar 2015 08:38
  • Hallo Michael!

    Man kann dein vorhaben mit den CPU1, CPU2, CPU3 usw. umsetzen, ist aber in Excel  Blödsinn, weil man in Excel und CSV Spaltenüberschriften nur sehr Schwer dynamisch gestalten kann!
    Wenn du das so in eine Tabelle hinein mogelst, kannst du die Daten nicht Maschinell weiterverarbeiten.

    Wie willst du das denn mit den Spaltenüberschriften hinkriegen?

    Lies dazumal meine Artikel hier:
    Export-CSV mit multidimensionalen (multivalue) Daten, auch für Microsoft Excel



    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Montag, 2. Februar 2015 09:59
  • Hallo Peter,

    vielen Dank für Deine Antwort. Ich würde gerne meinem Chef eine übersichtliche Liste über unsere Hardware im Hause vorlegen, da bietet sich Excel (nicht CSV) an, da ich diese auch nach seinen Wünschen automatisiert formatieren kann. Deinen Artikel habe ich gelesen und die Variante mit den Kommas in einer Spalte wird glaube ich zu unübersichtlich, da jemand der nicht jeden Tag damit arbeitet bei 3 IP-Adressen nicht auf einen Blick sieht, dass es sich hier um 3 Netzwerkadapter handelt.

    Hier nun meine Lösung für die Überschriften am Beispiel der CPUs:

    $script:CPUCounter = @()
    $script:CPUs = ""
    
    # Computernamen aus dem AD auslesen
    $ComputerNames = Get-ADComputer -Filter * | Select-Object -ExpandProperty Name
    
    ForEach ($ComputerName in $ComputerNames) {
        if(Test-Connection -ComputerName $ComputerName -Quiet -Count 1) {
        # wenn der Rechner per Ping erreichbar ist
            # CPU Name des Computers auslesen
            $script:CPUs = Get-WmiObject Win32_Processor -ComputerName $ComputerName | Select-Object -ExpandProperty Name
            # Array mit Anzahl der CPUs pro Rechner erstellen
            $CPUsArray = @()
            $CPUsArray += $script:CPUs
            $script:CPUCounter += $CPUsArray.Count 
        } #end if
        else{            
            # wenn der Rechner nicht per Ping erreich bar ist
            $script:CPUs = 'Host nicht erreichbar'
        } #end else
        
    # Maximale Anzahl der verbauten Geräte ermitteln
    $CPUMax = $script:CPUCounter | Measure-Object -max | Select-Object -expand maximum
    
    # Überschriften erstellen
    $Row = 1
    $Col = 1
    $ExlWorksheet.Cells.Item(1,$Col).Value2 = 'PC-Name'
    $Col++
    for($i=1; $i -le $CPUMax; $i++){
        $ExlWorksheet.Cells.Item(1,$Col).Value2 = 'CPU'+$i
        $Col++
    }

    Ich weiß, es ist umständlich und geht bestimmt einfacher, aber immerhin selbst erarbeitet.

    Gruß Michael


    Gruß Michael

    Dienstag, 3. Februar 2015 09:28
  • Hallo Michael!

    Ich hatte in meiner Antwort ja nicht bezweifelt, das man dies umsetzen kann.
    Du hast aber gesagt das der eine Rechner 3 CPUs haben kann der nächste Rechner 2 CPUs und 3 Festplatten und der übernächste Rechner hat 1 CPU 2 4 Festplatten und 2 Netzwerkkarten...... usw.

    Wenn du das in Excel automatisch darstellen möchtest dann viel Spass mit dem Code ;-) ! Möglich ist alles, ist alles auch sinnvoll?


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Dienstag, 3. Februar 2015 10:22
  • Hallo Peter,

    ich weiß, dass das nicht einfach ist, das ist ja gerade mein Problem. Mein Ansatz wäre ein mehrdimensionales Array zu erzeugen, in dem in der ersten Dimension der Rechnername oder ein Zähler steht und in der zweiten Dimension z.B. die CPUS. Ich versuche es mal mit einem Zähler darzustellen:

    MultiCPU [1][Intel P4 3,2 GHz;Intel P4 4,3 GHz]   #Das wäre der erste PC mit 2 CPUs

    MultiCPU [2][AMD FX8350 4,2 GHz]   #Ein zweiter PC mit nur einer CPU

    Die Tabelle müsste man wohl direkt bei der Erstellung der Überschriften auch befüllen, damit man sicher ist in der richtigen Spalte zu sein. Meine beiden Probleme sind eigentlich der Aufbau des Arrays (wie bekomme ich die Daten entsprechend diesem Format dort rein) und wie lese ich die Daten dann entsprechend wieder aus und schreibe Sie in Excel. 

    Sollte ich eine Lösung finden, werde ich Sie natürlich auch hier veröffentlichen.

    Gruß Michael

    PS: Ob es sinnvoll ist weiß ich nicht, es wäre halt nur schöne anpassbare Lösung.


    Gruß Michael

    Dienstag, 3. Februar 2015 11:59