Ein gutes Script hat auch ein Log. Das ist Fakt. Sobald Daten beispielweise im AD geändert werden, ist es erforderlich ein Log zu schreiben. Denn wer weiß, wann man die Änderung nochmal rückgängig machen muss oder ähnliches. Für einige Scripte habe ich mir eine Funktion geschrieben die zu einem die Eingabe etwas vereinfachen und etwas die Schreibarbeit verringern soll. Ziel ist es das Log in ein Text-File zuschreiben und in der Console mitlaufen zulassen. Ein weiteres Ziel ist dabei die Formatierung nicht immer wieder erneut zu wiederholen. Der Code wir schnell unübersichtlich bei einer Zeile für das Log und einer Zeile für die Ausgabe in der Console. Wenn nun einmal etwas im Log angepasst werden muss, dann darf ich durch das ganze Script gehen und schauen wo ich einmal einen Logeintrag generiere und muss jeweils zwei Zeilen anpassen. Dieser Mehraufwand soll verhindert werden. Ferner könnte ich auch eine Mail-Funktion in die Write-LOG Funktion implementieren und bei gewissen Werten, automatisch eine Mail versenden lassen.
Ich nutze hier nicht die Foreach- oder For-Schleife. In diesem Falle nutze ich das Switch Statement oder auch Case-Abfrage, Case-Schleife. Ziel ist es hier das seltener verwendete Switch Statement in einem praktischen Beispiel zu verwenden. Dies sieht bei gezielten Abfragen auch etwas übersichtlicher aus, als alles in If-Schleifen zu packen.
Das Funktion muss bei PowerShell oberhalb im Script stehen. Siehe dazu PowerShell – 11 – Funktionen (Functions).
Aufbau Write-LOG; Erklärung Switch Statement
Ich habe meine Funktion an die Standardfunktionen wie write-host angelehnt und nenne sie passender Weise Write-LOG. Intern verwende ich dann das besagte Switch Statement.
Die Funktion erwartet zwei Input-Werte, zu einem eine $Info und den $Status.
$Info enthält die Information die in das Log-File geschrieben werden sollen und $Status enthält den Wert, welcher für die jeweiligen Case zutreffend ist.
$Status kann folgende Werte annehmen, welche in einem Fall (Case) münden:
- Info
- Status
- Warning
- Error
Hauptsächlich dienen die Fälle (Cases) in meinem Beispiel dazu die Farbe der Schrift in der Console zu definieren. So sind Infos stets Grün, eine Warnung Gelb und Error-Meldungen Rot mit Weißen Hintergrund.
Wie Switch Statement funktioniert
In einem Switch-Statement wird jeweils ein Wert geprüft, ob dieser gleich einem der abgegeben Cases ist. Dieser Vorgang ist nicht Case sensitiv. Heißt Groß- und Kleinschreibung ist egal. Bei Übereinstimmung, also im Beispiel $Status ist gleich „Info“, „Status“, „Warning“ oder „Error“, wird der jeweilige Case ausgeführt.
Sollte der Wert nicht angegeben werden, oder keiner der entsprechenden Cases zutreffen, dann gibt es noch den default-Case. Hier kann in dem Switch Statement definiert werden, was mit nicht passenden Werten geschehen soll. Der default-Case muss nicht angegeben werden. Allerdings wird dann bei nicht zutreffenden Werten auch nichts unternommen. Weite Beispiele Switch Statement (engl.).:
Semikolon nutzen in Scripten
Das Semikolon „;“ nutze ich um nicht eine zweite Zeile Code pro Case anfangen zu müssen. In anderen Programmiersprachen wie C# muss jede Codezeile die beendet wird mit einem Semikolon enden. Alles was nachdem Semikolon steht, steht quasi auf einer neuen Zeile.
Script Write-LOG
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#Start - LOG function Write-LOG($Info, $Status) { switch($Status) { Info {Write-Host $Info -ForegroundColor Green ; $Info | Out-File -FilePath $LOG -Append} Status {Write-Host $Info -ForegroundColor Yellow ; $Info | Out-File -FilePath $LOG -Append} Warning {Write-Host $Info -ForegroundColor Yellow ; $Info | Out-File -FilePath $LOG -Append} Error {Write-Host $Info -ForegroundColor Red -BackgroundColor White; $Info | Out-File -FilePath $LOG -Append} default {Write-Host $Info -ForegroundColor white $Info | Out-File -FilePath $LOG -Append} } } #End - LOG |
Damit die Funktion auch genutzt werden kann, hier die…
Eingabe des Write-LOG
Es gibt natürlich mehrere Varianten die Funktion zu nutzten, bzw. die Daten zu übergeben.
Variante 1 enthält im String mehre Variablen. Variante 2 ist hingegen ein reiner String und Variante 3 übergibt lediglich das Datum.
1 2 3 4 5 6 7 8 9 |
#Variante 1 Write-LOG -Info "ZielOU $($SQLOU) wurde unterhalb von $($BaseOU) erfolgreich erstellt" -Status Status #Variante 2 Write-LOG -Info "Der Angegebene User konnte nicht gefunden werden" -Status Error #Variante 3 Write-LOG -Info date -Status Info |
Soweit erstmal zum Thema Switch Statement.
rewe
Hallo Stefan,
danke für das Log Script
Kann man es so anpassen, das in das Log der Status gleich mit reingeschrieben wird?
z.Bsp.
[Error] 2016-02-04-12:03 Der Angegebene User konnte nicht gefunden werden“
Gruss René