Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Alles, was Sie über die
Wie viele andere Sprachen verfügt PowerShell über Anweisungen zum bedingten Ausführen von Code in Ihren Skripts. Eine dieser Anweisungen ist die If-Anweisung . Heute werden wir einen umfassenden Einblick in einen der grundlegendsten Befehle in PowerShell werfen.
Hinweis
Die originale Version dieses Artikels erschien auf dem Blog, der von @KevinMarquette geschrieben wurde. Das PowerShell-Team danke Kevin für das Teilen dieser Inhalte mit uns. Bitte schauen Sie sich seinen Blog bei PowerShellExplained.com an.
Bedingte Ausführung
Ihre Skripts müssen häufig Entscheidungen treffen und unterschiedliche Logik basierend auf diesen Entscheidungen ausführen.
Das ist es, was ich mit bedingter Ausführung meine. Sie haben eine Anweisung oder einen Wert, die ausgewertet werden soll, und führen Sie dann einen anderen Codeabschnitt basierend auf dieser Auswertung aus. Dies ist genau das, was die if Anweisung tut.
Die Anweisung if
Hier ist ein grundlegendes Beispiel für die if Anweisung:
$condition = $true
if ( $condition )
{
Write-Output "The condition was true"
}
Als Erstes wertet die if Anweisung den Ausdruck in Klammern aus. Wenn $true ausgewertet wird, führt es die Anweisungen in den geschweiften Klammern aus. Wenn der Wert lautet $false, würde er diesen Anweisungsblock überspringen.
Im vorherigen Beispiel wertete die if Anweisung lediglich die $condition Variable aus. Es war $true und hätte den Write-Output Befehl innerhalb des Anweisungsblocks ausgeführt.
In einigen Sprachen können Sie eine einzelne Codezeile nach der if-Anweisung platzieren, und sie wird ausgeführt. Das ist in PowerShell nicht der Fall. Sie müssen eine vollständige statement block Klammer bereitstellen, damit sie ordnungsgemäß funktioniert.
Vergleichsoperatoren
Die am häufigsten verwendete Verwendung der if Anweisung besteht darin, zwei Elemente miteinander zu vergleichen. PowerShell verfügt über spezielle Operatoren für verschiedene Vergleichsszenarien. Wenn Sie einen Vergleichsoperator verwenden, wird der Wert auf der linken Seite mit dem Wert auf der rechten Seite verglichen.
-eq für Gleichheit
-eq führt eine Gleichheitsprüfung durch, um sicherzustellen, dass sie gleich sind.
$value = Get-MysteryValue
if ( 5 -eq $value )
{
# do something
}
In diesem Beispiel nehme ich einen bekannten Wert von 5 und vergleiche ihn mit meinem $value , um festzustellen, ob sie übereinstimmen.
Ein möglicher Anwendungsfall besteht darin, den Status eines Werts zu überprüfen, bevor Sie eine Aktion ausführen. Sie konnten einen Dienst abrufen und überprüfen, ob der Status läuft, bevor Sie Restart-Service auf ihn anwendeten.
In anderen Sprachen wie C# ist es üblich, das Gleichheitszeichen == (z. B. 5 == $value) zu verwenden, aber das funktioniert mit PowerShell nicht. Ein weiterer häufiger Fehler, den Personen machen, besteht darin, das Gleichheitszeichen (z. B. 5 = $value) zu verwenden, das für das Zuweisen von Werten zu Variablen reserviert ist. Indem Sie Ihren bekannten Wert auf der linken Seite platzieren, wird es schwieriger, diesen Fehler zu machen.
Dieser Operator (und andere) hat einige Variationen.
-
-eqGleichheit ohne Groß-/Kleinschreibung -
-ieqGleichheit ohne Groß-/Kleinschreibung -
-ceqGroß-/Kleinschreibungs-sensitive Gleichheit
-ne ungleich
Viele Operatoren verfügen über einen verwandten Operator, der das gegenteilige Ergebnis überprüft.
-ne Überprüft, ob die Werte nicht gleicheinander sind.
if ( 5 -ne $value )
{
# do something
}
Verwenden Sie dies, um sicherzustellen, dass die Aktion nur ausgeführt wird, wenn der Wert nicht 5. Eine sinnvolle Anwendungsmöglichkeit besteht darin, zu überprüfen, ob sich ein Dienst im laufenden Zustand befindet, bevor Sie versuchen, ihn zu starten.
Variationen:
-
-neGroß-/Kleinschreibung nicht gleich -
-ineGroß-/Kleinschreibung nicht gleich -
-cneGroß-/Kleinschreibung nicht gleich
Dies sind umgekehrte Variationen von -eq. Ich werde diese Typen gruppieren, wenn ich Variationen für andere Operatoren auflisten.
-gt -ge -lt -le für größer als oder kleiner als
Diese Operatoren werden beim Überprüfen verwendet, um festzustellen, ob ein Wert größer oder kleiner als ein anderer Wert ist.
Der -gt -ge -lt -le Stand für GreaterThan, GreaterThanOrEqual, LessThan und LessThanOrEqual.
if ( $value -gt 5 )
{
# do something
}
Variationen:
-
-gtgrößer als -
-igtgrößer als, Groß-/Kleinschreibung nicht beachtet -
-cgtgrößer als, groß-/kleinschreibungssensitiv -
-gegrößer oder gleich -
-igegrößer als oder gleich, Groß-/Kleinschreibung wird nicht beachtet -
-cgegrößer oder gleich, Groß- und Kleinschreibung beachten -
-ltkleiner als -
-iltkleiner als, Groß-/Kleinschreibung nicht beachtet -
-cltkleiner als, Groß-/Kleinschreibung beachtet -
-lekleiner oder gleich wie -
-ilekleiner als oder gleich, Groß-/Kleinschreibung nicht beachtet -
-cleKleiner oder gleich, Groß-/Kleinschreibung beachten
Ich weiß nicht, warum Sie bei diesen Operatoren Groß- und Kleinschreibung berücksichtigt und nicht berücksichtigt verwenden würden.
- wie Wildcard-Übereinstimmungen
PowerShell verfügt über eine eigene, platzhalterbasierte Mustervergleichssyntax, die Sie mit dem -like Operator verwenden können. Diese Wildcardmuster sind ziemlich einfach.
-
?entspricht jedem einzelnen Zeichen -
*entspricht einer beliebigen Anzahl von Zeichen
$value = 'S-ATX-SQL01'
if ( $value -like 'S-*-SQL??')
{
# do something
}
Es ist wichtig, darauf hinzuweisen, dass das Muster mit der gesamten Zeichenfolge übereinstimmt. Wenn Sie etwas in der Mitte der Zeichenfolge übereinstimmen müssen, müssen Sie das * auf beiden Enden der Zeichenfolge platzieren.
$value = 'S-ATX-SQL02'
if ( $value -like '*SQL*')
{
# do something
}
Variationen:
-
-likeGroß-/Kleinschreibung ignorierender Platzhalter -
-ilikegroß-/kleinschreibungsunabhängiger Platzhalter -
-clikeGroß-/Kleinschreibung beachten (Wildcards) -
-notlikeDie Groß-/Kleinschreibung wird nicht beachtet. -
-inotlikePlatzhalter ohne Berücksichtigung der Groß-/Kleinschreibung nicht übereinstimmend. -
-cnotlikekein Übereinstimmen eines case-sensitive Platzhalters
-regulären Ausdruck abgleichen
Mit dem -match Operator können Sie eine Zeichenfolge für eine übereinstimmung mit regulären Ausdrücken überprüfen. Verwenden Sie dies, wenn die Wildcardmuster nicht flexibel genug für Sie sind.
$value = 'S-ATX-SQL01'
if ( $value -match 'S-\w\w\w-SQL\d\d')
{
# do something
}
Ein regex-Muster stimmt standardmäßig an einer beliebigen Stelle in der Zeichenfolge überein. Sie können also eine Teilzeichenfolge angeben, die wie folgt abgeglichen werden soll:
$value = 'S-ATX-SQL01'
if ( $value -match 'SQL')
{
# do something
}
Regex ist eine komplexe Ausdruckssprache von sich aus und es lohnt sich, sie zu betrachten. Ich spreche mehr über -match und die vielen Möglichkeiten, regex in einem anderen Artikel zu verwenden.
Variationen:
-
-matchGroß-/Kleinschreibung-unabhängige Regex -
-imatchRegex ohne Groß-/Kleinschreibung -
-cmatchgroß-/kleinschreibungsempfindlicher Regex -
-notmatchNicht übereinstimmende Regex-Groß-/Kleinschreibung wird nicht berücksichtigt -
-inotmatchKeine Übereinstimmung bei regex-Suche ohne Beachtung der Groß-/Kleinschreibung -
-cnotmatchRegex mit Groß-/Kleinschreibung stimmt nicht überein
-ist vom Typ
Sie können den Typ eines Werts mit dem -is Operator überprüfen.
if ( $value -is [string] )
{
# do something
}
Sie können dies verwenden, wenn Sie mit Klassen arbeiten oder verschiedene Objekte über die Pipeline akzeptieren. Sie könnten entweder einen Dienst oder einen Dienstnamen als Eingabe verwenden. Überprüfen Sie dann, ob Sie über einen Dienst verfügen und den Dienst abrufen, wenn Sie nur den Namen haben.
if ( $Service -isnot [System.ServiceProcess.ServiceController] )
{
$Service = Get-Service -Name $Service
}
Variationen:
-
-isvom Typ -
-isnotnicht vom Typ
Auflistungsoperatoren
Wenn Sie die vorherigen Operatoren mit einem einzelnen Wert verwenden, erhalten Sie $true oder $false. Dies wird beim Arbeiten mit einer Sammlung etwas anders behandelt. Jedes Element in der Auflistung wird ausgewertet, und der Operator gibt jeden Wert zurück, der zu $true ausgewertet wird.
PS> 1,2,3,4 -eq 3
3
Dies funktioniert in einer if Anweisung immer noch richtig. Daher wird ein Wert von Ihrem Operator zurückgegeben, dann ist die gesamte Anweisung $true.
$array = 1..6
if ( $array -gt 3 )
{
# do something
}
In den Details hier versteckt sich eine kleine Falle, auf die ich hinweisen muss. Wenn Sie den -ne-Operator auf diese Weise verwenden, ist es leicht, die Logik fälschlicherweise umgekehrt zu betrachten. Die Verwendung -ne mit einer Auflistung gibt zurück $true , wenn ein Element in der Auflistung nicht mit Ihrem Wert übereinstimmt.
PS> 1,2,3 -ne 4
1
2
3
Dies mag wie ein cleverer Trick aussehen, aber wir haben Operatoren -contains und -in das behandeln dies effizienter. Und -notcontains tut, was Sie erwarten.
-enthält
Der -contains-Operator überprüft die Kollektion auf deinen Wert. Sobald es eine Übereinstimmung findet, gibt es $true zurück.
$array = 1..6
if ( $array -contains 3 )
{
# do something
}
Dies ist die bevorzugte Methode, um festzustellen, ob eine Sammlung Ihren Wert enthält. Die Verwendung von Where-Object (oder -eq) durchläuft die gesamte Liste jedes Mal und ist deutlich langsamer.
Variationen:
-
-containsGroß-/Kleinschreibung ignorieren -
-icontainsÜbereinstimmung zwischen Groß- und Kleinschreibung -
-ccontainsÜbereinstimmung zwischen Groß- und Kleinschreibung -
-notcontainsGroß-/Kleinschreibung führte zu keiner Übereinstimmung -
-inotcontainsGroß-/Kleinschreibung nicht übereinstimmend -
-cnotcontainsGroß-/Kleinschreibung entspricht nicht
-In
Der -in Operator ist genau wie der -contains Operator, außer die Sammlung befindet sich auf der rechten Seite.
$array = 1..6
if ( 3 -in $array )
{
# do something
}
Variationen:
-
-inGroß- und Kleinschreibung ignorieren -
-iinGroß- und Kleinschreibung ignorieren -
-cinÜbereinstimmung zwischen Groß- und Kleinschreibung -
-notinGroß-/Kleinschreibung nicht beachtet -
-inotinGroß-/Kleinschreibung-unempfindlich nicht übereinstimmend -
-cnotinGroß-/Kleinschreibung nicht übereinstimmend
Logische Operatoren
Logische Operatoren werden verwendet, um andere Ausdrücke invertieren oder zu kombinieren.
-Nicht
Der -not Operator kippt einen Ausdruck von $false zu $true oder von $true .$false Hier ist ein Beispiel, in dem wir eine Aktion ausführen möchten, wenn Test-Path$false ist.
if ( -not ( Test-Path -Path $path ) )
Die meisten der von uns besprochenen Operatoren haben eine Variante, bei der Sie den -not Operator nicht verwenden müssen. Aber es gibt immer noch Zeiten, die es nützlich ist.
! operator
Sie können ! als Alias für -not verwenden.
if ( -not $value ){}
if ( !$value ){}
Möglicherweise sehen Sie ! häufiger bei Menschen, die aus anderen Programmiersprachen wie C# kommen. Ich gebe es lieber ein, weil ich es schwer erkennen kann, wenn ich meine Skripte schnell durchsehe.
-und
Sie können Ausdrücke mit dem -and Operator kombinieren. Wenn Sie dies tun, müssen beide Seiten $true sein, damit der gesamte Ausdruck $true ist.
if ( ($age -gt 13) -and ($age -lt 55) )
In diesem Beispiel $age muss 13 oder älter für die linke Seite und weniger als 55 für die rechte Seite sein. Ich habe zusätzliche Klammern hinzugefügt, um es in diesem Beispiel klarer zu machen, aber sie sind optional, solange der Ausdruck einfach ist. Hier ist dasselbe Beispiel ohne sie.
if ( $age -gt 13 -and $age -lt 55 )
Die Auswertung erfolgt von links nach rechts. Wird das erste Element auf $false ausgewertet, erfolgt ein vorzeitiger Abbruch, und der Vergleich wird nicht durchgeführt. Dies ist praktisch, wenn Sie sicherstellen müssen, dass ein Wert vorhanden ist, bevor Sie ihn verwenden. Wirft zum Beispiel Test-Path einen Fehler aus, wenn Sie ihm einen $null Pfad übergeben.
if ( $null -ne $path -and (Test-Path -Path $path) )
-oder
Mit -or können Sie zwei Ausdrücke angeben. $true wird zurückgegeben, wenn einer der Ausdrücke $true ist.
if ( $age -le 13 -or $age -ge 55 )
Genau wie bei dem -and Operator erfolgt die Auswertung von links nach rechts. Außer wenn der erste Teil $true ist, ist die gesamte Anweisung $true und der Rest des Ausdrucks nicht verarbeitet wird.
Beachten Sie außerdem, wie die Syntax für diese Operatoren funktioniert. Sie benötigen zwei separate Ausdrücke. Ich habe gesehen, dass Benutzer versuchen, etwas wie dies $value -eq 5 -or 6 zu tun, ohne ihren Fehler zu erkennen.
-xor exklusiv oder
Das ist ein bisschen ungewöhnlich.
-xor ermöglicht, dass nur ein Ausdruck zu $true ausgewertet wird. Wenn also beide Elemente $false sind oder beide Elemente $true sind, dann ist der gesamte Ausdruck $false. Eine weitere Möglichkeit, dies zu betrachten, ist, dass der Ausdruck nur $true wahr ist, wenn die Ergebnisse des Ausdrucks unterschiedlich sind.
Es ist selten, dass jeder diesen logischen Operator jemals verwenden würde, und ich kann mir kein gutes Beispiel dafür vorstellen, warum ich es jemals verwenden würde.
Bitweise Operatoren
Bitweise Operatoren führen Berechnungen für die Bits innerhalb der Werte aus und erzeugen einen neuen Wert als Ergebnis. Bitweise Operatoren liegen außerhalb des Umfangs dieses Artikels, aber hier ist eine Liste dieser Operatoren.
-
-bandbinär UND -
-borbinär ODER -
-bxorbinäre exklusive ODER -
-bnotbinär NICHT -
-shlLinksverschiebung -
-shrnach rechts verschieben
PowerShell-Ausdrücke
Wir können normale PowerShell in der Bedingungsanweisung verwenden.
if ( Test-Path -Path $Path )
Test-Path gibt zurück $true oder $false wenn sie ausgeführt wird. Dies gilt auch für Befehle, die andere Werte zurückgeben.
if ( Get-Process Notepad* )
Es ergibt $true, wenn ein zurückgegebener Prozess vorhanden ist, und $false, wenn keiner vorhanden ist. Es ist völlig in Ordnung, Pipelineausdrücke oder andere PowerShell-Anweisungen auf diese Weise zu verwenden:
if ( Get-Process | where Name -EQ Notepad )
Diese Ausdrücke können miteinander mit den -and Operatoren -or kombiniert werden, aber Sie müssen möglicherweise Klammern verwenden, um sie in Unterausdrücke aufzuteilen.
if ( (Get-Process) -and (Get-Service) )
Überprüfen auf $null
Es wird entweder kein Ergebnis oder ein $null-Wert in der if-Anweisung zu $false ausgewertet. Bei einer speziellen Überprüfung von $null ist es eine bewährte Praxis, das $null auf der linken Seite zu platzieren.
if ( $null -eq $value )
Es gibt einige Nuancen beim Umgang mit $null Werten in PowerShell. Wenn Sie daran interessiert sind, tiefer zu tauchen, habe ich einen Artikel über alles, was Sie über $null wissen wollten.
Variable Zuordnung innerhalb der Bedingung
Ich habe fast vergessen, diese hinzuzufügen, bis Prasoon Karunan V mich daran erinnerte.
if ($process=Get-Process notepad -ErrorAction Ignore) {$process} else {$false}
Wenn Sie einer Variablen normalerweise einen Wert zuweisen, wird der Wert nicht an die Pipeline oder Konsole übergeben. Wenn Sie eine Variablenzuweisung in einem Unterausdruck ausführen, wird sie an die Pipeline übergeben.
PS> $first = 1
PS> ($second = 2)
2
Erfahren Sie, wie die $first Zuordnung keine Ausgabe hat und wie die $second Zuordnung funktioniert? Wenn eine Aufgabe in einer if Anweisung ausgeführt wird, wird sie genau wie die $second oben beschriebene Aufgabe ausgeführt. Hier ist ein sauberes Beispiel für die Verwendung:
if ( $process = Get-Process Notepad* )
{
$process | Stop-Process
}
Wenn $process ein Wert zugewiesen wird, wird die Anweisung $true und $process gestoppt.
Stellen Sie sicher, dass Sie dies -eq nicht verwechseln, da dies keine Gleichheitsprüfung ist. Dies ist ein unbekanntes Feature, das die meisten Menschen nicht bemerken, dass es auf diese Weise funktioniert.
Variable Zuordnung aus dem Anweisungsblock
Sie können auch den if Anweisungsblock verwenden, um einer Variablen einen Wert zuzuweisen.
$discount = if ( $age -ge 55 )
{
Get-SeniorDiscount
}
elseif ( $age -le 13 )
{
Get-ChildDiscount
}
else
{
0.00
}
Jeder Skriptblock schreibt die Ergebnisse der Befehle oder des Werts als Ausgabe. Wir können das Ergebnis der if Anweisung der $discount Variablen zuweisen. In diesem Beispiel könnten diese Werte $discount der Variablen direkt in jedem Anweisungsblock genauso einfach zugewiesen werden. Ich kann nicht sagen, dass ich dies oft mit der if Aussage verwende, aber ich habe ein Beispiel, in dem ich dies kürzlich verwendet habe.
Alternativer Ausführungspfad
Mit der if Anweisung können Sie eine Aktion nicht nur angeben, wenn die Anweisung lautet $true, sondern auch für den Zeitpunkt $false. Hier kommt die else Aussage ins Spiel.
oder
Die else Anweisung ist immer der letzte Teil der if Anweisung, wenn sie verwendet wird.
if ( Test-Path -Path $Path -PathType Leaf )
{
Move-Item -Path $Path -Destination $archivePath
}
else
{
Write-Warning "$path doesn't exist or isn't a file."
}
In diesem Beispiel überprüfen wir $path, um sicherzustellen, dass es sich um eine Datei handelt. Wenn wir die Datei finden, verschieben wir sie. Wenn nicht, schreiben wir eine Warnung. Diese Art von Verzweigungslogik ist sehr häufig.
Geschachtelt, wenn
Die Anweisungen if und else nehmen einen Skriptblock, sodass wir jeden PowerShell-Befehl darin platzieren können, einschließlich eines weiteren if-Statements. Auf diese Weise können Sie viel kompliziertere Logik verwenden.
if ( Test-Path -Path $Path -PathType Leaf )
{
Move-Item -Path $Path -Destination $archivePath
}
else
{
if ( Test-Path -Path $Path )
{
Write-Warning "A file was required but a directory was found instead."
}
else
{
Write-Warning "$path could not be found."
}
}
In diesem Beispiel testen wir zuerst den glücklichen Pfad und ergreifen dann entsprechende Maßnahmen. Wenn dies fehlschlägt, führen wir eine weitere Überprüfung durch und stellen dem Benutzer detailliertere Informationen zur Verfügung.
Elseif
Wir sind nicht nur auf eine einzige bedingte Prüfung beschränkt. Wir können if- und else-Anweisungen miteinander verketten, anstatt sie zu verschachteln, indem wir die elseif-Anweisung verwenden.
if ( Test-Path -Path $Path -PathType Leaf )
{
Move-Item -Path $Path -Destination $archivePath
}
elseif ( Test-Path -Path $Path )
{
Write-Warning "A file was required but a directory was found instead."
}
else
{
Write-Warning "$path could not be found."
}
Die Ausführung erfolgt von oben nach unten. Die oberste if Anweisung wird zuerst ausgewertet. Falls dies $false ist, wird zur nächsten elseif oder else in der Liste nach unten gewechselt. Das letzte else ist die Standardaktion, die ausgeführt wird, wenn keiner der anderen $true zurückgibt.
switch
Zu diesem Zeitpunkt muss ich die switch Aussage erwähnen. Es stellt eine alternative Syntax zum Ausführen mehrerer Vergleiche mit einem Wert bereit. Mit dem switch Ausdruck geben Sie einen Ausdruck an, und das Ergebnis wird mit mehreren verschiedenen Werten verglichen. Wenn einer dieser Werte übereinstimmt, wird der übereinstimmende Codeblock ausgeführt. Sehen Sie sich dieses Beispiel an:
$itemType = 'Role'
switch ( $itemType )
{
'Component'
{
'is a component'
}
'Role'
{
'is a role'
}
'Location'
{
'is a location'
}
}
Es gibt drei mögliche Werte, die mit dem $itemType übereinstimmen können. In diesem Fall entspricht es Role. Ich habe nur ein einfaches Beispiel verwendet, um Ihnen eine gewisse Exposition gegenüber dem switch Operator zu geben. In einem anderen Artikel erkläre ich ausführlicher über alles, was Sie jemals über die Switch-Anweisung wissen wollten.
Array Inline
Ich habe eine Funktion namens Invoke-SnowSql , die eine ausführbare Datei mit mehreren Befehlszeilenargumenten startet. Hier ist ein Clip aus dieser Funktion, in dem ich das Array von Argumenten erstellt.
$snowSqlParam = @(
'--accountname', $Endpoint
'--username', $Credential.UserName
'--option', 'exit_on_error=true'
'--option', 'output_format=csv'
'--option', 'friendly=false'
'--option', 'timing=false'
if ($Debug)
{
'--option', 'log_level=DEBUG'
}
if ($Path)
{
'--filename', $Path
}
else
{
'--query', $singleLineQuery
}
)
Die $Debug- und $Path-Variablen sind Parameter der Funktion, die vom Endbenutzer bereitgestellt werden.
Ich bewerte sie direkt bei der Initialisierung meines Arrays. Wenn $Debug dies der Fall ist, fallen diese Werte an die $snowSqlParam richtige Stelle. Gleiches gilt für die $Path Variable.
Vereinfachen komplexer Vorgänge
Es ist unausweichlich, dass man in eine Situation gerät, mit deutlich zu vielen zu überprüfenden Vergleichen, und Ihre if Anweisung weit nach rechts aus dem Bildschirm scrollt.
$user = Get-ADUser -Identity $UserName
if ( $null -ne $user -and $user.Department -eq 'Finance' -and $user.Title -match 'Senior' -and $user.HomeDrive -notlike '\\server\*' )
{
# Do Something
}
Sie können schwer zu lesen sein und machen Sie anfälliger für Fehler. Dazu gibt es ein paar Dinge, die wir tun können.
Zeilenfortsetzung
Es gibt einige Operatoren in PowerShell, mit denen Sie Ihren Befehl in die nächste Zeile umbrechen können. Die logischen Operatoren -and und -or eignen sich gut, wenn Sie Ihren Ausdruck in mehrere Zeilen unterteilen möchten.
if ($null -ne $user -and
$user.Department -eq 'Finance' -and
$user.Title -match 'Senior' -and
$user.HomeDrive -notlike '\\server\*'
)
{
# Do Something
}
Dort ist noch viel los, aber die Platzierung jedes Elements in einer eigenen Zeile macht einen großen Unterschied. Ich verwende dies in der Regel, wenn ich mehr als zwei Vergleiche erhalte oder wenn ich nach rechts scrollen muss, um eine der Logik zu lesen.
Vorkalkulation der Ergebnisse
Wir können diese Aussage aus der if Anweisung herausnehmen und nur das Ergebnis überprüfen.
$needsSecureHomeDrive = $null -ne $user -and
$user.Department -eq 'Finance' -and
$user.Title -match 'Senior' -and
$user.HomeDrive -notlike '\\server\*'
if ( $needsSecureHomeDrive )
{
# Do Something
}
Das fühlt sich viel sauberer an als das vorherige Beispiel. Außerdem erhalten Sie die Möglichkeit, einen Variablennamen zu verwenden, der erläutert, was Sie wirklich überprüfen. Dies ist auch ein Beispiel für Selbstdokumentierungscode, der unnötige Kommentare speichert.
Mehrere If-Anweisungen
Wir können dies in mehrere Aussagen aufteilen und sie nacheinander überprüfen. In diesem Fall verwenden wir ein Flag oder eine Tracking-Variable, um die Ergebnisse zu kombinieren.
$skipUser = $false
if( $null -eq $user )
{
$skipUser = $true
}
if( $user.Department -ne 'Finance' )
{
Write-Verbose "isn't in Finance department"
$skipUser = $true
}
if( $user.Title -match 'Senior' )
{
Write-Verbose "Doesn't have Senior title"
$skipUser = $true
}
if( $user.HomeDrive -like '\\server\*' )
{
Write-Verbose "Home drive already configured"
$skipUser = $true
}
if ( -not $skipUser )
{
# do something
}
Ich musste die Logik umkehren, damit die Flaggenlogik ordnungsgemäß funktioniert. Jede Auswertung ist ein individueller if Ausdruck. Der Vorteil ist, dass Sie beim Debuggen genau erkennen können, was die Logik tut. Ich konnte gleichzeitig viel bessere Ausführlichkeit hinzufügen.
Der offensichtliche Nachteil ist, dass es so viel mehr Code zu schreiben ist. Der Code ist komplexer zu betrachten, da es eine einzelne Logikzeile benötigt und in 25 oder mehr Zeilen explodiert.
Verwenden von Funktionen
Wir können auch alle diese Validierungslogik in eine Funktion verschieben. Sehen Sie sich an, wie sauber dies auf einen Blick aussieht.
if ( Test-SecureDriveConfiguration -ADUser $user )
{
# do something
}
Sie müssen die Funktion dennoch erstellen, um die Überprüfung zu erledigen, aber dieser Code erleichtert die Arbeit mit diesem Code erheblich. Dieser Code erleichtert das Testen. In Ihren Tests können Sie den Aufruf Test-ADDriveConfiguration modellieren und nur zwei Tests für diese Funktion benötigen. Eine, bei der es $true zurückgibt, und eine, bei der es $false zurückgibt. Das Testen der anderen Funktion ist einfacher, da sie so klein ist.
Der Körper dieser Funktion könnte immer noch entweder ein Einzeiler sein, mit dem wir begonnen haben, oder die ausführliche Logik, die wir im letzten Abschnitt verwendet haben. Dies eignet sich gut für beide Szenarien und ermöglicht es Ihnen, diese Implementierung später auf einfache Weise zu ändern.
Fehlerbehandlung
Eine wichtige Verwendung der if Anweisung besteht darin, auf Fehlerbedingungen zu überprüfen, bevor Fehler auftreten. Ein gutes Beispiel ist die Überprüfung, ob bereits ein Ordner vorhanden ist, bevor Sie versuchen, ihn zu erstellen.
if ( -not (Test-Path -Path $folder) )
{
New-Item -Type Directory -Path $folder
}
Ich möchte sagen, dass, wenn Sie eine Ausnahme erwarten, dann ist es nicht wirklich eine Ausnahme. Überprüfen Sie also Ihre Werte, und überprüfen Sie Ihre Bedingungen, wo Sie können.
Wenn Sie etwas mehr in die eigentliche Ausnahmebehandlung eintauchen möchten, habe ich einen Artikel zu allem, was Sie jemals über Ausnahmen wissen wollten.
Endgültige Wörter
Die if Anweisung ist eine so einfache Anweisung, ist aber ein grundlegendes Element von PowerShell. Sie werden dieses in fast jedem Script, das Sie schreiben, mehrmals verwenden. Ich hoffe, Sie haben ein besseres Verständnis, als Sie zuvor hatten.