Heute möchte ich euch 3 Tricks näher bringen wie Ihr mit der Powershell einfach und geniale Reportings erstellen könnt.

Gerade als Administrator ist ein “Reporting” manchmal unumgänglich.
So möchte der Vorgesetzte gerne einen Report über eingebrachte Updates oder oder oder haben oder alleine für die tägliche Checkliste ist dies manchmal sehr mühsam.

Doch, dank der Powershell und Ihren fast unbegrenzten möglichkeiten ist hier ein “hübsches” Powershell Reporting möglich das auf “Knopfdruck” alles gewünschte darstellt.
Das ist doch das was einem mitunter am Herzen liegt. Oder? ;)

Nun, wie stellen wir das ganze aber in der Powershell an?

In Reports oder auf der Powershell commandozeile ist das doch meistens ein Graus wenn man einen Ordner auflistet und sieht nur die bytes und nicht das bequemere Format Megabytes.
Hier haben wir einen ersten Trick der Powershell parat.

Get-ChildItem -Path c:\windows |
  # Dupliziere die Objekte und behalte die Eigenschaften / setze die Eigenschaften die Du willst (zum Beispiel "Alter...")
  Select-Object -Property LastWriteTime, 'Age(days)', Length, Name, PSIsContainer |
  # Aendere die Eigenschaften des Duplizierten Objektes wie Du es magst
  ForEach-Object {
    # Berechne Datei/Ordner alter in tagen
    $_.'Age(days)' = (New-Timespan -Start $_.LastWriteTime).Days

    # if it is a file, change size in bytes to size in MB
    if ($_.PSisContainer -eq $false)
    {
      $_.Length = ('{0:N1} MB' -f ($_.Length / 1MB))
    }

    # Vergiss nicht die festgelegten Werte zurueckzugeben
    $_
  } |
  # Abschließend waehle die Eigenschaften die Du im Report haben möchtest:
  Select-Object -Property LastWriteTime, 'Age(days)', Length, Name |
  # Sortiere die Powershell ausgabe wie Du magst:
  Sort-Object -Property LastWriteTime -Descending |
  Out-GridView 

Das Resultat in Powershell sollte dann z.b. in etwa wie folgt aussehen…
Powershell_Report_Ausgabe Nun sehen wir ein erstes Ergebniss das zwar noch nicht ganz so schön aussieht im Powershell GridView, aber das Ergebniss könnte man sich auch als Report in html oder CSV (Excel) von der Powershell ausgeben lassen.

Wie?

Bauen wir ein wenig weiter.

Gehen wir davon aus das uns die Werte aus c:\windows unbedingt interessieren und wir aber noch mehr über ein System wissen möchten.
Dieses wollen wir uns aber in Excel ausgeben lassen um daraus dann auch hübsche Grafiken erstellen zu können.

Wir erweitern ndazu einfach unseren vorhandenen Powershell Code so das er dann wie folgt aussieht:

 

# Mittels $Path geben wir einen temporaeren Ordner fuer unsere CSV datei an die auch einen zufaelligen Namen traegt "$(Get-Random)"
$Path = "$env:temp\$(Get-Random).csv"
#$originalProperties = 'Name', 'Id', 'Company', 'Description', 'WindowTitle'
#Get-Process | 
#  Select-Object -Property $originalProperties |
#  Export-Csv -Path $Path -Encoding UTF8 -NoTypeInformation -UseCulture
#Invoke-Item -Path $Path 

Get-ChildItem -Path c:\windows |
  # Dupliziere die Objekte und behalte die Eigenschaften / setze die Eigenschaften die Du willst (zum Beispiel "Alter...")
  Select-Object -Property LastWriteTime, 'Age(days)', Length, Name, PSIsContainer |
  # Aendere die Eigenschaften des Duplizierten Objektes wie Du es magst
  ForEach-Object {
    # Berechne Datei/Ordner alter in tagen
    $_.'Age(days)' = (New-Timespan -Start $_.LastWriteTime).Days

    # if it is a file, change size in bytes to size in MB
    if ($_.PSisContainer -eq $false)
    {
      $_.Length = ('{0:N1} MB' -f ($_.Length / 1MB))
    }

    # Vergiss nicht die festgelegten Werte zurueckzugeben
    $_
  } |
  # Abschließend waehle die eigenschaften die Du im Report haben möchtest:
  Select-Object -Property LastWriteTime, 'Age(days)', Length, Name |
  # Sortiere die Ausgabe wie Du magst:
  Sort-Object -Property LastWriteTime -Descending |
  # Out-GridView #Auskommentiert da wir das ergebniss nunu in Excel erhalten möchten...
  # Nachfolgend geben wir an das Excel automatisch das Trennzeichen erkennen soll "-UseCulture"
  Export-Csv -Path $Path -Encoding UTF8 -NoTypeInformation -UseCulture
  Invoke-Item -Path $Path 

Die nun erfolgte Änderung bewirkt das die Powershell ausgabe nun fein säuberlich von Powershell in CSV exportiert wird und dann direkt (falls Excel installiert ist) öffnet.

Ihr seht, mit diesem kurzen und knappen Code kann man sich viel mühseelige Llickarbeit ersparen dank der Powershell.

Gut, die hier gezeigten beispiele sind jetzt nicht gerade etwas was man immer braucht aber durchaus ein guter ansatz zum selbst überlegen wie man was wie machen kann / könnte.
Ich habe somit z.b. mir etwas gebaut, das mir auf verlangen Teile eines Eventlogs eines angefragten Systems liefert.
Dank der Ausgabe mittels CSV ist somit ein bequemes sortieren und suchen möglich.

Mittels

Get-WmiObject -Class Win32_NTLogEvent -Filter 'Type="Error" and (LogFile="System" or LogFile="Application")' | 
Select-Object -First 100 -Property TimeGenerated, LogFile, EventCode, Message

lasse ich mir z.b. ein paar teile aus den Eventlog ausgeben und kann diese dann dank der Powershell ganz gemütlich und übersichtlich auswerten. :)


3 Tricks wie Du mit der Powershell ansehnliche Reports erstellen kannst

3 Gedanken zu „3 Tricks wie Du mit der Powershell ansehnliche Reports erstellen kannst

  • 24/01/2016 um 13:25
    Permalink

    Powershell ist extrem mächtig, muss mich da auch mal wieder tiefer reinfuchsen.

    Antworten
  • 16/01/2016 um 14:23
    Permalink

    Ich finde den ARtikel nicht nur sehr angenehm zum Lesen, sondern auch sehr informativ. Gleichzeitig muss ich aber leider sagen, dass es mir persönlich am nötigen Fachwissen fehlt, um den Inhalt umzusetzen. Trotzdem vielen Dank!

    Antworten
  • 20/06/2015 um 23:40
    Permalink

    Danke für die Anleitung. Für einen Anfänger wie mich aber nicht ganz einfach :)

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.