26. Februar 2020 Aleksej Kusnir

PowerShell if else switch Tutorial

Sie möchten in Ihrem PowerShell Skript eine Logik einbringen?

Dazu können Sie in PowerShell Abfragen wie if, if else oder switch verwenden.

Wie Sie das genau tun, werde Ich Ihnen in diesem Blogpost zeigen.

More...

Bevor wir aber mit dem Skripten beginnen, sollten Sie verstehen welche Abfrage die bessere ist und wann Sie diese nutzen sollten.

Was ist eine Abfrage / Bedingung?

Ich möchte Ihnen die Abfrage anhand uns Menschen erklären.

Nehmen wir mal an, jemand Fragt Sie ob Sie was Essen gehen möchten.

Dann würden Sie sich z.B. die Frage stellen, möchte Sie etwas essen oder nicht, korrekt?

Wenn Sie etwas Essen möchten, sagen Sie Ja und gehen dann zusammen was essen!

Genau dafür sind Mechanismen für Abfragen in PowerShell vorhanden. Damit Sie im Laufe des Skripts bestimmte Informationen oder Zustände prüfen und darauf entscheiden, was zu tun ist.

Dabei gibt es 2 Mechanismen in PowerShell um eine Situation abzufragen.

IF ELSE vs. SWITCH

Die if else und die switch Variante sind ziemlich ähnliche Abfragearten in PowerShell. Trotzdem gibt es da klare unterschiede, wann welche Variante zu Einsatz kommt.

Die if else Variante kann viel mehr Parameter und Variationen mitgeben als beim Switch. Sie können mit der IF Abfrage mehrere Variationen prüfen.

IF Else sind gut geeignet für Vergleiche wo etwas Richtig oder Falsch sein kann. Hier können sie auch mit "UND" und "ODER" spielen.

Also das kann auch ziemlich komplex werden. Deswegen mein Tipp.

Technotier TIPP

Schauen Sie das die Abfrage möglichst klar und verständlich ist. Ansonsten wird das Troubleshooting ziemlich nervenzeraubend, wenn etwas in der Abfrage geändert werden muss.

Aleksej Kusnir

Die Switch Variante wird vor allem dann genutzt, wenn Sie einzelne Variablen mit bestimmten Werten vergleichen wollen.

Nehmen wir mal an Sie haben eine Tabelle an Werten und Sie möchten prüfen ob eine Variable einem dieser Werte entspricht?

z.B: Hat die Variable den Wert = "A" oder ist der Wert = "B" oder ist der Wert = "C" usw.

IF ELSE Einsatz

  • Wenn Sie Boolen (JA | NEIN) Werte erwarten.
  • Wenn Sie mehrere logische Situationen gleichzeitig abfragen möchten
  • Wenn Sie mehrere Variablen mit einander vergleichen

SWITCH

  • Wenn die Werte bekannt sind die Sie abfragen möchten.
  • Wenn Sie nur einzelne Werte (String, Objekt usw..) abfragen möchten
  • Sieht mehr strukturierter aus als eine IF ELSE Abfrage

Um dies nochmal genau zu verdeutlichen, lassen Sie uns erstmal die Logischen Parameter kurz anschauen und dann gehe ich nochmal genau auf die if else und die switch Variante.

Logische Parameter in der PowerShell Abfrage

Damit das PowerShell Abfragen so richtig Spaß macht, benötigen wir eine Logik, die wir nutzen können.

Die Logik wird durch die Vergleichsoperatoren aus der Programmierung ermöglicht.

Anbei sind die Vergleichsoperatoren beschrieben.

Abfrage

PowerShell Parameter

Kleiner als

-lt

Kleiner oder gleich

-le

Größer

-gt

Größer oder gleich

-ge

Gleich

-eq

Ungleich

-ne

Lassen Sie uns nun die einzelnen Varianten mit Praxisbeispielen anschauen in dem wir auch die Vergleichsoperatoren aus der Tabelle verwenden.

IF Else

Um die if elese Abfrage besser zu erklären habe ich für uns ein Beispiel Szenario.

Nehmen wir mal an, wir möchten bei vielen Windows Systemen überprüfen ob die C: Partition genug Speicher frei hat.

Dazu möchten wir ein PowerShell Skript schreiben, das ein Fehler ausgibt, wenn die C: Partition weniger als 20% freien Speicher zur Verfügung hat.

Wenn die C: Partition aber mehr als 20% hat, dann soll ein OK ausgegeben werden.

Das Skript dazu sieht folgendermaßen aus: Hier wird der Vergleichsoperator -lt verwendet.

$CPartition=Get-Volume -DriveLetter C

$Prozenz=($CPartition.SizeRemaining/$CPartition.Size)*100

if($Prozenz -lt 20)
{
Write-Host "Es sind weniger als 20% Speicherplatz verfügbar."

Write-Host "Freier Speicherplatz: $Prozenz%"
}

else
{
Write-Host "Es ist genung Speicherplatz verfügbar."

Write-Host "Freier Speicherplatz: $Prozenz%"
}

In diesem Screencast spielen wir bisschen mit dem Code und Verwenden auch mal andere Vergleichsoperatoren.

Lassen Sie uns gemeinsam ein paar Beispiele anschauen.

Beispiel 1:

In diesem Beispiel frage ich einfach nur den Windows Service wuauserv ab. Wenn dieser Service existiert dann wird der Code in IF abgearbeitet.

Würden wir hier jetzt einen Service eintragen den es gar nicht gibt, würde der Code in der Else abgearbeitet.

if(get-service -Name "wuauserv")
{
Write-Host "Es gibt den Service wuauserv"
}
else
{
Write-Host "Es gibt den Service wuauserv nicht
}

Beispiel 2:

Dieses Beispiel ist ähnlich dem ersten Beispiel mit dem Unterschied das wir hier einen Vergleichoperator "-or" zusätzlich dabei haben.

Hier prüfen wir mit der Abfrage ob der Service wuauser oder der Service wuauserv existieren.

Da ein der beiden Service existieren wird der Code in IF ausgeführt.

-OR bedeutet ja, wenn eines der beiden Abfragen stimmt ist die Abfrage somit richtig.

if((get-service -Name "wuauser") -or (get-service -Name "wuauserv"))
{
Write-Host "Geht"
}
else
{
Write-Host "Geht nicht"
}

Schauen wir uns das gemeinsam noch in einem Screencast an. Dort zeige ich auch noch eine dritte Variante.

Switch Abfragen

Um die Switch Abfrage aus der Praxis darzustellen habe ich für uns ein paar Beispiele mitgebracht.

Nehmen wir mal das Beispiel von IF ELSE mit der Festplattenauslastung. Wir überprüfen ob die C: Partition genug Speicher frei hat.

Dazu möchten wir ein PowerShell Skript schreiben, das ein Fehler ausgibt, wenn die C: Partition weniger als 20% freien Speicher zur Verfügung hat.

Wenn die C: Partition aber mehr als 20% hat, dann soll ein OK ausgegeben werden.

Nur das wir diesmal die Switch Abfrage verwenden.

Das Problem mit der Switch Abfrage ist, dass wir die erwarteten Werte vorgeben. Somit müssen wir hier die einzelnen Prozentwerte, die wir überprüfen wollen angeben.

Damit dies besser geht, Runde ich noch mit dem Befehl: $Prozent=[math]::Round($Prozent) den Prozentwert auf.

Das Skript dazu sieht folgendermaßen aus:

$CPartition=Get-Volume -DriveLetter C

$Prozent=($CPartition.SizeRemaining/$CPartition.Size)*100

$Prozent=[math]::Round($Prozent)

switch ($Prozent)

{

60 {Write-Host "Frei: $Prozent"}

61 {Write-Host "Frei: $Prozent"}

62 {Write-Host "Frei: $Prozent"}

63 {Write-Host "Frei: $Prozent"}

64 {Write-Host "Frei: $Prozent"}

90 {Write-Host "Frei: $Prozent"}

66 {Write-Host "Frei: $Prozent"}

67 {Write-Host "Frei: $Prozent"}

68 {Write-Host "Frei: $Prozent"}

69 {Write-Host "Frei: $Prozent"}

70 {Write-Host "Frei: $Prozent"}

80 {Write-Host "Frei: $Prozent"}

81 {Write-Host "Frei: $Prozent"}

82 {Write-Host "Frei: $Prozent"}

default{ Write-Host "Kein Wert ermittelt"}

}

Meiner Meinung nach, eignet sich die Switch Variante für solch eine Aufgaben nicht unbedingt.

Nehmen wir mal ein anderes Beispiel. Der Benutzer muss eine Zahl zwischen 1-10 eingeben. Je nachdem welche Zahl er eingegeben hat soll ein anderer Code ausgeführt werden.

Dann würde hier die Switch Variante besser dastehen.

switch (Read-Host -Prompt "Geben Sie bitte eine Zahl zwischen 1 und 5 ein")

{

1 {Write-Host "Sie haben die 1 eingegeben"}

2 {Write-Host "Sie haben die 2 eingegeben"}

3 {Write-Host "Sie haben die 3 eingegeben"}

4 {Write-Host "Sie haben die 4 eingegeben"}

5 {Write-Host "Sie haben die 5 eingegeben"}

default{ Write-Host "Sie haben keine Zahl zwischen 1 und 5 eingegeben"}

}

Das ist eine sehr schöne Switch Variante.

Fazit

In diesem Tutorial haben Sie gelernt, was die IF ELSE und die SWITCH Variante sind und wie Sie diese anwenden. Des Weiteren habe ich Ihnen gezeigt wo die Unterschiede der beiden Abfragen liegen.

Anhand von weiteren Beispielen können Sie nun if else und switch Abfragen selbständig anwenden.

Ich wünsche Ihnen viel Erfolg.

Aleksej Kusnir