if und switch
Das IF-Kommando führt einen Skriptblock nur dann aus, wenn eine vorher gegebene Bedingung erfüllt ist. Die zu prüfende Bedingung wird bei IF in runden Klammern angegeben.
Die Bedingungsprüfung erfolgt genau wie bei Where-Object – wenn der in runden Klammern angegebene Ausdruck nicht "Falsch" oder "Nichts" zurückgibt, startet IF den Skriptblock, ansonsten wird der Skriptblock übersprungen (s. auch Where-Object)
If () {} # Erste Bedingung abprüfen
Elseif () {} # weitere Bedingung(en) abprüfen (Optional)
Else {} # Default, falls keine Bedingung übereinstimmt (Optional)
Mehrere Bedingungen können durch Elseif miteinander verknüpft werden, wobei die Überprüfung weiterer Bedingungen abgebrochen wird, sobald eine Prüfung nicht zu "Falsch" oder "Nichts" auswertet. Daher ist die Reihenfolge, in der die Prüfung ausgeführt wird, wichtig. Ist keine Bedingung wahr, kann optional mit Else ein Skriptblock angegeben werden, der ohne eine Prüfung ausgeführt wird.
Das folgende Beispiel fragt zwei Bedingungen ab und setzt eine Default-Option:
$Starttime = (Get-CimInstance -ClassName win32_operatingsystem).LastBootUpTime
If ( $Starttime -gt (get-date).AddDays(-14) )
{
Restart-Computer -Force -WhatIf
}
Elseif ( $Starttime -gt (get-date).AddDays(-7) )
{
'Der Computer sollte neu gestartet werden' | Out-Gridview
}
Else
{
$LogEntry = '{0} OK' -f ( get-date -Format 'yyyy-MM-dd HH:mm:ss' ) Out-File -FilePath $env:TEMP\startlog.lxt -Append
}
In der ersten Zeile des Skripts wird über CIM (Common Information Model) die Startzeit des Computers abgerufen. Anschließend wird mit IF geprüft, ob der Computer länger als 14 Tage läuft, indem mit Hilfe der AddDays-Methode des Datetime-Typs vom aktuellen Datum 14 Tage abgezogen werden. Ist das Ergebnis wahr, wird der erste Skriptblock gestartet, der einen Computerneustart erzwingt. Whatif sorgt im Übrigen dafür, dass der Computer nicht wirklich neu gestartet wird, falls sie versehentlich das komplette Skript ausführen. Stattdessen wird nur eine Ausgabe an der Konsole ausgegeben. Wie Sie in Ihre eigenen Skripte eine WhatIf-Prüfung implementieren, finden Sie im Abschnitt WhatIf und Confirm.
Ist die erste Bedingung nicht erfüllt, wird die zweite Überprüfung ausgeführt, die testet, ob der Computer länger als 7 Tage läuft. Ist die Bedingung erfüllt, wird in einem Gridview ein Text ausgegeben.
Ist auch diese Bedingung nicht erfüllt, wird der Else-Block ausgeführt, die das aktuelle Datum im Format Jahr-Monat-Tag Stunden:Minuten:Sekunden ausgibt und als Formatierungsoption (s. Text (formatiert) ausgeben) in einen String übernimmt. Anschließend wird der Text in ein Logfile im Temp-Ordner geschrieben.
Eine Methode, um IF-Abfragen mit vielen Bedingungen übersichtlicher zu schreiben, ist das Switch-Kommando. Switch hat gegenüber IF allerdings eine Einschränkung: Es kann nur ein einzelner Wert auf verschiedene Zustände überprüft werden (wie im obigen Beispiel die Startzeit). Das liegt daran, dass der zu überprüfende Wert im Kopf des Switch-Statements angegeben wird:
$Wert = 1
Switch ( $Wert ) # der zu überprüfende Wert wird bereits im Kopf übergeben
{
{$_ -eq 1} {'Zahl 1'} # Im Skriptblock wird die anonyme Variable verwendet
{$_ -eq 2} {'Zahl 2'}
{$_ -eq 3} {'Zahl 3'}
}
Hinter dem Schlüsselwort Switch folgt in runden Klammern immer der zu prüfende Wert, und danach werden in einem Skriptblock, ähnlich wie bei einem IF, jeweils die Bedingung und der Skriptblock angegeben, nur dass hier kein IF und Elseif als Schlüsselwörter stehen. Der zu überprüfende Wert wird mit der anonymen Variablen $_ referenziert.
Ein paar Besonderheiten sind hier zu beachten. Zum einen wird die Bedingung im Switch nicht in runde Klammern eingefasst, sondern in geschweifte. Es handelt sich also, wie beim Where-Object, um einen eigenständigen Skriptblock. Die zweite Besonderheit ist, dass der Switch tatsächlich keinen Elseif durchführt, sondern jeder Prüfung einem IF entspricht. Ist also eine Bedingung wahr, bricht das Skript nicht ab , sondern führt trotzdem alle weiteren Überprüfungen aus.
$Wert = 1 Switch ($Wert)
{
{$_ -le 1} {'Zahl 1'}
{$_ -le 2} {'Zahl 2'}
{$_ -le 3} {'Zahl 3'}
}
Im Beispiel werden 3 Ausgaben erzeugt, da eins kleiner gleich eins ist, aber eben auch kleiner gleich zwei und drei. Sie können die Beendigung der Prüfung erzwingen, indem Sie im Ausführungsblock einen break am Ende einfügen, der die Beendigung des Durchlaufs erzwingt.
Switch ($Wert)
{
{$_ -le 1} {'Zahl 1'; Break}
{$_ -le 2} {'Zahl 2'; Break}
{$_ -le 3} {'Zahl 3'; Break}
}
In der dritten Bedingung ist der break in eine Zeile mit der Ausgabe geschrieben, wobei die beiden Kommandos durch ein Semikolon getrennt sind. Das kann den Code hier ein bisschen übersichtlicher machen, sollte aber im Normalfall vermieden werden.
Switch kann sogar Arrays direkt verarbeiten und unterschiedliche Bedingungen kombinieren:
$Wert = 1,2,3,4,-1
Switch ( $Wert )
{
{ $_ -eq 1 } { 'Zahl 1' }
{ $_ -in 2,3 } { 'Zahl ist größer 2' }
{ $_ -lt 1 } { 'Zahl ist kleiner 1' }
default { '$_ wird durch keine Bedingung verarbeitet' }
}
Außerdem hat der Switch einen default, der nur ausgegeben wird, wenn ke ine der angegebenen Bedingungen wahr ist. Damit entspricht er in seiner Funktion dem Else.
Switch ist besonders gut geeignet für Fälle, die alle Bedingungen auf Gleichheit prüfen. Dann kann man nämlich statt des Bedingungsblocks einfach den Zielwert angeben.
$Ausgabe = 'Gridview'
$VirtualMachines = Get-VM
Switch ( $Ausgabe )
{
GridView { $VirtualMachines | Out-GridView }
CSV { $VirtualMachines | Export-Csv -Path $HOME\VMs.csv } Console { $VirtualMachines }
}
Sollten Sie kein Hyper-V installiert haben, verwenden Sie statt Get-VM einfach Get-Childitem oder ein beliebiges anderes Cmdlet. Dieses Beispiel wird Ihnen in ähnlicher Form im Abschnitt Parameter wieder unterkommen, wenn es darum geht, zu prüfen, welches Argument ein Benutzer für einen bestimmten Parameter angegeben hat. Die Kurzform ersetzt diese lange Variante des Skripts:
$Ausgabe = 'Gridview'
$VirtualMachines = Get-VM
Switch ( $Ausgabe )
{
{ $_ -eq 'GridView' } { $VirtualMachines | Out-GridView }
{ $_ -eq 'CSV' } { $VirtualMachines | Export-Csv -Path $HOME\VMs.csv }
{ $_ -eq 'Console' } { $VirtualMachines }
}