none
IP-Adresse und dazugehörigen Hostnamen in Excel speichern RRS feed

  • Frage

  • Hallo,

    habe schon lange bei Google gesucht, jedoch (evtl. auf Grund meiner Unerfahrenheit mit Powershell) nichts gefunden.

    Ich habe ein Script erstellt, dass mir eine Excel-Tabelle erstellt, die Computernamen aus dem AD abruft und diese in Excel in die erste Spalte schreibt. In der zweiten Spalte sollen nun die IP-Adressen stehen. Mein Problem ist jetzt, das es im Netzwerk Computer mit mehreren Adressen gibt. Somit müsste der Computername zweimal auftauchen, was ich aber nicht hinbekomme.

    Hier mal mein Code der entsprechend ausliest und in Arrays schreibt:

    # Computernamen aus AD auslesen und Computer abfragen
    Function read_Data(){

    # Computernamen aus dem AD auslesen
        $global:Computer = Get-ADComputer -Filter * | ForEach-Object {$_.Name}
        # Daten der Rechner auslesen
            foreach ($Computer in $global:Computer) {
                if(Test-Connection -ComputerName $Computer -Quiet -Count 1) {
                $Networks = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $Computer | where {$_.ipenabled -eq "true"}                              
                foreach ($Network in $Networks) {
                    $global:IPAddress += ,@($Network.IpAddress[0])
                } #end foreach $Network
            } #end if
            else{           
                    $global:IPAddress += ,@("Host nicht erreichbar")
            } #end else
           
        } # end foreach $Computer 

    } # Function read_Data beenden

    So, an folgender Stelle liegt mein Problem:

     $Networks = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $Computer | where {$_.ipenabled -eq "true"}              

    Ich müsste im Array Networks entsprechend zur Config noch den Rechnernamen speichern, ich habe aber keine Ahnung wie.

    Ich hoffe Ihr könnt mir helfen.

              


    Gruß Michael


    • Bearbeitet KundT Dienstag, 9. Dezember 2014 13:41
    Dienstag, 9. Dezember 2014 13:39

Antworten

  • Hallo Michael!

    1.)
    Vermeide Globale Variablen wie die Pest! Diese können von jedem geändert werden, deshalb kannst du dir nie sicher sein was diese enthalten.
    Die Globalen Variablen machen in deinem Code auch keinen Sinn.
    Stattdessen sollten Objekt, wie bei einem Staffellauf, von einer Funktion zu anderen, als Parameter übergeben werden.

    2.)
    Bei jedem Aufruf einer Funktion über Ihren Namen wird die Funktion ausgeführt.
    In deiner Funktion mit dem Namen „write_Data“ wird die Funktion „read_Data“  2mal aufgerufen das ist unnötig, belastet das Active Directory und die Ausführung dauert 2mal so lange!

    3.)
    Die Namen von Funktionen sollten dem gleichen Namens Konzept wie die Cmdlets folgen. Ein Verb ein Bindestrich und ein Nomen (Singular).

    4.)
    Eine Aufteilung der Arbeitsschritte mit der Excel Tabelle in einzelne Funktionen macht wenig Sinn, da die Excel Tabelle als gesamtes behandelt werden sollte.

    5.)
    Das Erstellen einer Funktion macht erst Sinn, wenn der Code in der Funktion mehr als einmal gebraucht wird.
    Dies ist bei dir nicht der Fall. Deshalb mache ich aus deinem ganzen Funktionswirrwarr ein einziges Script.

    6.)
    Daten wie Pfade zum Abspeichern die sich ändern können, sollte man immer am Anfang des Skriptes definieren, damit man diese leicht wiederfindet und an einer Stelle geändert werden können.
    Dann kann man aus diesen auch leichter Parameter machen.

    Ungetestet!!:

    Set-StrictMode -Version '2.0'
    Clear-Host
    Import-module ActiveDirectory
    
    # Pfad zum abspeichern der Excel Arbeitsmappe (hier ändern)
    $ExcelSavePath = '\\FS\NSJonas\IT\ADMIN-istration\Admin\PC_Daten.xlsx' 
    
    
    # Excel-Applikation erstellen
    $ExlApp = New-Object -ComObject Excel.Application 
    # Excel-Applikation sichtbar machen
    $ExlApp.Visible = $True
    # Excel-Arbeitsmappe in der Excel Applikation erstellen
    $ExlWorkBook = $ExlApp.Workbooks.Add()
    # Aus der Excel-Arbeitsmappe das erste Arbeitsblatt auswählen
    $ExlWorksheet = $ExlWorkBook.Worksheets.Item(1)
    
    # Festlegen der SpaltenNmummern für die einzelnen Überschriften
    $ColComputerName = 1
    $ColIPAdress = 2
    $ColCPU = 3
    $ColRAM = 4
    
    # Ueberschriften in der ersten Zeile in den einzelnen Zellen erstellen
    $ExlWorksheet.Cells.Item(1,$ColComputerName).Value2 = 'PC-Name'
    $ExlWorksheet.Cells.Item(1,$ColIPAdress).Value2 = 'IP-Adresse'
    $ExlWorksheet.Cells.Item(1,$ColCPU).Value2 = 'CPU'
    $ExlWorksheet.Cells.Item(1,$ColRAM).Value2 = 'RAM'
    
    # Den bereich in der ersten Zeile mit Fett-Druck formatieren
    $ExlWorksheet.Range($ExlWorksheet.Cells.Item(1,1),$ExlWorksheet.Cells.Item(1,4)).Font.Bold = $True 
    
    # Computernamen aus dem AD auslesen
    $ComputerNames = Get-ADComputer -Filter * | Select-Object -ExpandProperty Name
    
    # Start-Zeilennummer im Excel Tabellenblatt festlegen
    $Row = 2
    
    # Jeden Rechner einzeln verarbeiten
    ForEach ($ComputerName in $ComputerNames) {
        
        if(Test-Connection -ComputerName $ComputerName -Quiet -Count 1) {
            # wenn der Rechner per Ping erreich bar ist
    
            # CPU Name des Computers auslesen
            $CPU = Get-WmiObject Win32_Processor -ComputerName $ComputerName | Select-Object -ExpandProperty Name
    
            # Physikalischen Speicher des Computers in Byte auslesen
            $RamTotal = Get-WMIObject -class win32_physicalmemory -ComputerName $ComputerName| ForEach-Object -begin { $RamTotal = 0 } -process { $RamTotal += $_.Capacity } -end {$RamTotal}
            
            # Netzwerkkarte(n) des Rechners auslesen die eien IPAdresse haben
            $Networks = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $ComputerName | Where-Object {$_.ipenabled -eq 'true'}                               
            
            # Für jede gefunde Netzwerkkarte die IPAdresse holen und in Excel den Computernamen und die IP eintragen
            # jede IP eines Rechners bekommt in Excel eine eigene Zeile, dadurch können Rechnernamen doppelt in der Tabelle auftauchen!
            ForEach ($Network in $Networks) {
                
              # Zellen in der aktuellen Zeile befüllen
              $ExlWorksheet.Cells.Item($Row,$ColComputerName).Value2 = $ComputerName
              $ExlWorksheet.Cells.Item($Row,$ColIPAdress).Value2 = $Network.IpAddress[0]
              $ExlWorksheet.Cells.Item($Row,$ColCPU).Value2 = $CPU
              $ExlWorksheet.Cells.Item($Row,$ColRAM).Value2 = "$($RamTotal / 1GB)GB"
    
              # Zeilennummer im Excel Tabellenblatt hochzählen (Zeilenvorschub) für die nächste IPAdresse
              $Row++
    
            } #end foreach $Network
        } #end if
        else{            
            # wenn der Rechner nicht per Ping erreich bar ist
            
              $ExlWorksheet.Cells.Item($Row,$ColComputerName).Value2 = $ComputerName
              $ExlWorksheet.Cells.Item($Row,$ColIPAdress).Value2 = 'Host nicht erreichbar'
              
              # Zeilennummer im Excel Tabellenblatt hochzählen (Zeilenvorschub)
              $Row++           
        } #end else
                
    } # end foreach $Computer
    
    # Speichern der Arbeitsmappe
    $ExlApp.Application.DisplayAlerts = $False
    $ExlWorkBook.SaveAs($ExcelSavePath)
    $ExlApp.Application.DisplayAlerts = $True


    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+

    • Als Antwort markiert KundT Donnerstag, 11. Dezember 2014 12:30
    Mittwoch, 10. Dezember 2014 15:45

Alle Antworten

  • Hallo Michael!

    PowerShell produziert und verarbeitet am liebsten Objekte (keinen Text) !!!!!!

    Deshalb ist es im Umgang mit PowerShell Essentiell sich in das Objekt orientierte denken einzuarbeiten.

    So müsste es gehen (ungetestet):

    # Computernamen aus AD auslesen und Computer abfragen Function read_Data(){ # Computernamen aus dem AD auslesen $ComputerNames = Get-ADComputer -Filter * | ForEach-Object {$_.Name} # Daten der Rechner auslesen foreach ($ComputerName in $ComputerNames) {

    $IPAdress = @() if(Test-Connection -ComputerName $Computer -Quiet -Count 1) { $Networks = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $ComputerName | Where-Object {$_.ipenabled -eq 'true'} foreach ($Network in $Networks) { $IPAddress += ,@($Network.IpAddress[0]) } #end foreach $Network } #end if else{ $IPAddress += ,@('Host nicht erreichbar') } #end else # Ergebnis als Objekt ausgeben # mit New-Object ein neues Objekt mit den gewünschten Eigenschaften erstellen # Die Eigenschaft IPAdress und Computername wird an das Objekt drangeklebt und die Werte werden in die Eigenschaften übertragen New-Object -TypeName PSObject -Property @{ Computername = $Computer IPAdress = [String]($IPAddress -join ',') } } # end foreach $Computer } # Function read_Data beenden # Daten holen und in eine CSV Datei im Temp Ordner Schreiben read_Data | Export-CSV -NoTypeInformation -UseCulture -Path "$env:Temp\AD-Computers.csv" # wenn Excel Installiert ist wird die CSV Datei mit Excel durch diesen Befehl geöffnet & "$env:Temp\AD-Computers.csv"


    # Computernamen aus AD auslesen und Computer abfragen
    Function read_Data(){
    # Computernamen aus dem AD auslesen
        $ComputerNames = Get-ADComputer -Filter * | ForEach-Object {$_.Name}
        # Daten der Rechner auslesen
            foreach ($ComputerName in $ComputerNames) {
                $IPAddress = ''
                if(Test-Connection -ComputerName $Computer -Quiet -Count 1) {
                  $Networks = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $ComputerName | Where-Object {$_.ipenabled -eq 'true'}                              
                  foreach ($Network in $Networks) {
                    # Ergebnis als Objekt ausgeben
                    # mit New-Object ein neues Objekt mit den gewünschten Eigenschaften erstellen
                    # Die Eigenschaft IPAdress und Computername wird an das Objekt drangeklebt und die Werte werden in die Eigenschaften übertragen
                    # jedes WMI Objekt enhaält das Property __SERVER mit dem Rechnernamen!  
                    New-Object -TypeName PSObject -Property @{
                      Computername = $Network.__SERVER
                      IPAdress = $Network.IpAddress[0]
                    }
                  } #end foreach $Network
                } #end if
                else{           
                  $IPAddress += ,@('Host nicht erreichbar')
                  # Ergebnis als Objekt ausgeben
                  # mit New-Object ein neues Objekt mit den gewünschten Eigenschaften erstellen
                  # Die Eigenschaft IPAdress und Computername wird an das Objekt drangeklebt und die Werte werden in die Eigenschaften übertragen  
                  New-Object -TypeName PSObject -Property @{
                    Computername = $Computer
                    IPAdress = [String]($IPAddress -join ',')
                  }
                } #end else

        } # end foreach $Computer
    } # Function read_Data beenden

    # Daten holen und in eine CSV Datei im Temp Ordner Schreiben
    read_Data | Export-CSV -NoTypeInformation -UseCulture -Path "$env:Temp\AD-Computers.csv"

    # wenn Excel Installiert ist wird die CSV Datei mit Excel durch diesen Befehl geöffnet
    & "$env:Temp\AD-Computers.csv"



    Schau dir mal meine PowerShell Videos auf Youtube an. Link findest du in meiner Signatur hier:


    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, 9. Dezember 2014 14:39
  • Hallo Peter,

    vielen Dank für Deine schnelle Hilfe. Nun habe ich aber noch das Problem, ich möchte aus Formatierungszwecken eine xlsx erstellen. Das bekomme ich auch soweit hin, jedoch bekomme ich die Objekt-Daten nicht in die Tabelle. Mit den Arrays habe ich das geschafft. Ich füge mal den gesamten Quellcode hinzu.

    Set-StrictMode -Version "2.0"
    Clear-Host
    import-module ActiveDirectory
    
    # Definition der globalen Variablen
    $global:Computer ="leer"
    $global:IPAddress = @()
    $Networks = @()
    
    
    
    
    # Excel-Tabelle erstellen
    Function Main {
        # Excel-Applikation erstellen und sichtbar machen
        $ExcelApp = New-Object -ComObject Excel.Application 
        $ExcelApp.Visible = $True
        # Excel-Arbeitsmappe inklusive einer Tabelle erstellen
        $Workbook =$ExcelApp.Workbooks.Add()
        # Definition des Tabellenblatts
        $Worksheet = $ExcelApp.Worksheets.Item(1)
    
        # Funktionen aufrufen
        #read_Data #$Networks
        create_Headlines $Worksheet
        write_Data $Worksheet
    
        # Speichern der Arbeitsmappe
        $FilePath =  "\\FS\NSJonas\IT\ADMIN-istration\Admin\PC_Daten.xlsx" 
        $ExcelApp.Application.DisplayAlerts = $False
        $Workbook.SaveAs($FilePath)
        $ExcelApp.Application.DisplayAlerts = $True
    } # Function Main beenden
    
    #Ueberschriften erstellen
    Function create_Headlines(){
        Param($Sheet)    
        $Sheet.range($Sheet.Cells.Item(1,1),$Sheet.Cells.Item(1,4)).Font.Bold = $true
        $Sheet.Cells.Item(1,1).Value2 = "PC-Name"
        $Sheet.Cells.Item(1,2).Value2 = "IP-Adresse"
        $Sheet.Cells.Item(1,3).Value2 = "CPU"
        $Sheet.Cells.Item(1,4).Value2 = "RAM"
    } # Function Create_Headlines beenden
    
    # Computernamen aus AD auslesen und Computer abfragen
    Function read_Data(){
        # Computernamen aus dem AD auslesen
        $global:Computer = Get-ADComputer -Filter * | ForEach-Object {$_.Name}
        # Daten der Rechner auslesen
        foreach ($Computer in $global:Computer) {
            if(Test-Connection -ComputerName $Computer -Quiet -Count 1) {
                $Networks = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $Computer | where {$_.ipenabled -eq "true"}                               
                foreach ($Network in $Networks) {
                    # Objekt erstellen und Eigenschaften Server(Rechnername) und IPAdress(Adresse) dranhängen
                    New-Object -TypeName PSObject -Property @{
                        Computername = $Network.__SERVER
                        IPAddress = $Network.IpAddress[0]
                    } #end New-Object
                } #end foreach $Network
            } #end if
            else{            
               # $IPAddress = ("Host nicht erreichbar")
                # Objekt erstellen und Eigenschaften Server(Rechnername) und IPAddress(Adresse) dranhängen
                New-Object -TypeName PSObject -Property @{
                    Computername = $Computer
                    IPAddress = "Host nicht erreichbar" -join ','
                } #end New-Object           
            } #end else
            
        } # end foreach $Computer
        
               
        
    } # Function read_Data beenden
    
    
    # Daten in Excel schreiben
    Function write_Data(){
        Param($Sheet)  
        $PCs= @()
        $PCs = read_Data | Select Computername
        $Row=2
    	$Col=1
        Foreach ($PCName in $PCs) {
            $Sheet.Cells.item($Row,$Col)=$PCName
            $Row++
        }
        $LANAddress= @()
        $LANAddress = read_Data | Select IPAddress
        $Row=2
    	$Col=2
        Foreach ($LA in $LANAddress) {
            $Sheet.Cells.item($Row,$Col)=$LA
            $Row++
        }
    } # Function write_Data beenden
    
    Main
    Der Fehler liegt laut Ausgabe bei $Sheet.Cells.item($Row,$Col)=$PCName und natürlich auch bei

    $Sheet.Cells.item($Row,$Col)=$LA

    Ausnahme beim Festlegen von Item.

    Danke noch mal.

    Gruß Michael


    Gruß Michael

    Mittwoch, 10. Dezember 2014 13:34
  • Hallo Michael!

    1.)
    Vermeide Globale Variablen wie die Pest! Diese können von jedem geändert werden, deshalb kannst du dir nie sicher sein was diese enthalten.
    Die Globalen Variablen machen in deinem Code auch keinen Sinn.
    Stattdessen sollten Objekt, wie bei einem Staffellauf, von einer Funktion zu anderen, als Parameter übergeben werden.

    2.)
    Bei jedem Aufruf einer Funktion über Ihren Namen wird die Funktion ausgeführt.
    In deiner Funktion mit dem Namen „write_Data“ wird die Funktion „read_Data“  2mal aufgerufen das ist unnötig, belastet das Active Directory und die Ausführung dauert 2mal so lange!

    3.)
    Die Namen von Funktionen sollten dem gleichen Namens Konzept wie die Cmdlets folgen. Ein Verb ein Bindestrich und ein Nomen (Singular).

    4.)
    Eine Aufteilung der Arbeitsschritte mit der Excel Tabelle in einzelne Funktionen macht wenig Sinn, da die Excel Tabelle als gesamtes behandelt werden sollte.

    5.)
    Das Erstellen einer Funktion macht erst Sinn, wenn der Code in der Funktion mehr als einmal gebraucht wird.
    Dies ist bei dir nicht der Fall. Deshalb mache ich aus deinem ganzen Funktionswirrwarr ein einziges Script.

    6.)
    Daten wie Pfade zum Abspeichern die sich ändern können, sollte man immer am Anfang des Skriptes definieren, damit man diese leicht wiederfindet und an einer Stelle geändert werden können.
    Dann kann man aus diesen auch leichter Parameter machen.

    Ungetestet!!:

    Set-StrictMode -Version '2.0'
    Clear-Host
    Import-module ActiveDirectory
    
    # Pfad zum abspeichern der Excel Arbeitsmappe (hier ändern)
    $ExcelSavePath = '\\FS\NSJonas\IT\ADMIN-istration\Admin\PC_Daten.xlsx' 
    
    
    # Excel-Applikation erstellen
    $ExlApp = New-Object -ComObject Excel.Application 
    # Excel-Applikation sichtbar machen
    $ExlApp.Visible = $True
    # Excel-Arbeitsmappe in der Excel Applikation erstellen
    $ExlWorkBook = $ExlApp.Workbooks.Add()
    # Aus der Excel-Arbeitsmappe das erste Arbeitsblatt auswählen
    $ExlWorksheet = $ExlWorkBook.Worksheets.Item(1)
    
    # Festlegen der SpaltenNmummern für die einzelnen Überschriften
    $ColComputerName = 1
    $ColIPAdress = 2
    $ColCPU = 3
    $ColRAM = 4
    
    # Ueberschriften in der ersten Zeile in den einzelnen Zellen erstellen
    $ExlWorksheet.Cells.Item(1,$ColComputerName).Value2 = 'PC-Name'
    $ExlWorksheet.Cells.Item(1,$ColIPAdress).Value2 = 'IP-Adresse'
    $ExlWorksheet.Cells.Item(1,$ColCPU).Value2 = 'CPU'
    $ExlWorksheet.Cells.Item(1,$ColRAM).Value2 = 'RAM'
    
    # Den bereich in der ersten Zeile mit Fett-Druck formatieren
    $ExlWorksheet.Range($ExlWorksheet.Cells.Item(1,1),$ExlWorksheet.Cells.Item(1,4)).Font.Bold = $True 
    
    # Computernamen aus dem AD auslesen
    $ComputerNames = Get-ADComputer -Filter * | Select-Object -ExpandProperty Name
    
    # Start-Zeilennummer im Excel Tabellenblatt festlegen
    $Row = 2
    
    # Jeden Rechner einzeln verarbeiten
    ForEach ($ComputerName in $ComputerNames) {
        
        if(Test-Connection -ComputerName $ComputerName -Quiet -Count 1) {
            # wenn der Rechner per Ping erreich bar ist
    
            # CPU Name des Computers auslesen
            $CPU = Get-WmiObject Win32_Processor -ComputerName $ComputerName | Select-Object -ExpandProperty Name
    
            # Physikalischen Speicher des Computers in Byte auslesen
            $RamTotal = Get-WMIObject -class win32_physicalmemory -ComputerName $ComputerName| ForEach-Object -begin { $RamTotal = 0 } -process { $RamTotal += $_.Capacity } -end {$RamTotal}
            
            # Netzwerkkarte(n) des Rechners auslesen die eien IPAdresse haben
            $Networks = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $ComputerName | Where-Object {$_.ipenabled -eq 'true'}                               
            
            # Für jede gefunde Netzwerkkarte die IPAdresse holen und in Excel den Computernamen und die IP eintragen
            # jede IP eines Rechners bekommt in Excel eine eigene Zeile, dadurch können Rechnernamen doppelt in der Tabelle auftauchen!
            ForEach ($Network in $Networks) {
                
              # Zellen in der aktuellen Zeile befüllen
              $ExlWorksheet.Cells.Item($Row,$ColComputerName).Value2 = $ComputerName
              $ExlWorksheet.Cells.Item($Row,$ColIPAdress).Value2 = $Network.IpAddress[0]
              $ExlWorksheet.Cells.Item($Row,$ColCPU).Value2 = $CPU
              $ExlWorksheet.Cells.Item($Row,$ColRAM).Value2 = "$($RamTotal / 1GB)GB"
    
              # Zeilennummer im Excel Tabellenblatt hochzählen (Zeilenvorschub) für die nächste IPAdresse
              $Row++
    
            } #end foreach $Network
        } #end if
        else{            
            # wenn der Rechner nicht per Ping erreich bar ist
            
              $ExlWorksheet.Cells.Item($Row,$ColComputerName).Value2 = $ComputerName
              $ExlWorksheet.Cells.Item($Row,$ColIPAdress).Value2 = 'Host nicht erreichbar'
              
              # Zeilennummer im Excel Tabellenblatt hochzählen (Zeilenvorschub)
              $Row++           
        } #end else
                
    } # end foreach $Computer
    
    # Speichern der Arbeitsmappe
    $ExlApp.Application.DisplayAlerts = $False
    $ExlWorkBook.SaveAs($ExcelSavePath)
    $ExlApp.Application.DisplayAlerts = $True


    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+

    • Als Antwort markiert KundT Donnerstag, 11. Dezember 2014 12:30
    Mittwoch, 10. Dezember 2014 15:45
  • Hallo Peter,

    Dein Script ist nun getestet und funktioniert. Ich habe dennoch ein paar Dinge geändert. Die Ermittlung des Arbeitsspeichers gibt bei z. B. 12 GB einen Kommabetrag aus. Ich habe das ganze gerundet und auch ein anderes Object verwendet, was mir sofort ohne Rechnen den kompletten Speicher ausgibt.

    # Physikalischen Speicher des Computers in Byte auslesen und in GB umrechnen
            $RamByte = Get-WMIObject -class Win32_ComputerSystem -ComputerName $ComputerName | Select-Object -ExpandProperty TotalPhysicalMemory
            $RamTotal = "" + [Math]::round($RamByte / (1024 * 1024 * 1024), 0) + " GB"
    $ExlWorksheet.Cells.Item($Row,$ColRAM).Value2 = $RamTotal

    Außerdem habe ich noch am Ende des Scripts vor dem Speichern von Excel die Spaltenbreite angepasst.

    # Spaltenbreite anpassen
    $Range = $ExlWorksheet.UsedRange
    $Range.EntireColumn.AutoFit() | Out-Null 

    Ich danke Dir vielmals für Deinen Hilfe und vor allem auch für Deine Belehrungen zur PowerShell-"Programmierung". Das mit den Funktionen kam noch von der Java-Programmierung an der Uni, da geht ja alles nur über Klassen und Funktionen. Eigentlich hätte ich das mit den Objekten natürlich dann schon drauf haben müssen. Jetzt werde ich noch versuchen die HDD's, die User und die Drucker in meiner Liste mit aufzunehmen. Werde mich da mit Deinen Tipps mal selber durchschlagen, ich möchte das ja lernen.

    Ich gebe dann mal Rückmeldung, wenn ich weiter bin. 



    Gruß Michael

    Donnerstag, 11. Dezember 2014 12:55
  • Schön das es klappt.
    PowerShell kann man wie ein Administrator als Script benutzen oder wie ein Programmiere mit Funktionen.

    Wenn man einfach einen Arbeitsprozess abbilden will ist es meist einfacher ein Script (ohne Funktionen) zu bauen das den gesamten Prozess von oben nach unten abbildet.

    Funktionen werden in einem Script nur verwendet wenn man einen Code teil hat der mehr als einmal gebraucht wird.

    Funktionen werden in PowerShell eher als eine Sammlung von 'universell wiederverwendbaren' Code Teilen betrachtet. Diese Werden dann in so genannten Modulen, zusammen in einer Datei mit der Endung .psm1 abgespeichert und als Modul geladen. Die Module haben keinerlei Prozessablauf und stellen wie eine Bibliothek Funktionen zur Verfügung.


    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+

    Donnerstag, 11. Dezember 2014 15:28
  • Hallo Peter,

    ich habe jetzt noch ein bisschen rumprobiert und versuche gerade die Excel-Tabelle dynamischer zu gestalten. Allerdings habe ich dabei ein Problem, und zwar habe ich versucht, die maximale Anzahl der Netzwerkadapter auszulesen, um danach eine Spalte Netzwerkadapter1, Netzwerkadapter2, usw. zu erstellen. Ich schaffe es auch mir ein Array mit der Anzahl der Netzwerkadapter pro Computer zu erstellen, jedoch habe ich Moment keine Ahnung, wie ich einfach den höchsten Wert auslese. Muss ich jedes mal das Array sortieren, in einem neuen abspeichern und dann den ersten Wert auslesen?

    Danke schon mal

    Gruß Michael 


    Gruß Michael

    Donnerstag, 18. Dezember 2014 13:55