Udostępnij za pośrednictwem


Wszystko, co chciałeś wiedzieć o deklaracji if

Podobnie jak w przypadku wielu innych języków, program PowerShell zawiera instrukcje dotyczące warunkowego wykonywania kodu w skryptach. Jedną z tych instrukcji jest instrukcja If. Dziś przyjrzymy się szczegółowo jednemu z najbardziej podstawowych poleceń w programie PowerShell.

Uwaga

Oryginalna wersja tego artykułu pojawiła się na blogu prowadzonym przez @KevinMarquette. Zespół programu PowerShell dziękuje Kevinowi za udostępnienie tej zawartości nam. Zapoznaj się ze swoim blogiem na PowerShellExplained.com.

Wykonywanie warunkowe

Skrypty często muszą podejmować decyzje i wykonywać różne logiki na podstawie tych decyzji. To jest to, co mam na myśli przez wykonywanie warunkowe. Masz jedną instrukcję lub wartość do obliczenia, a następnie wykonaj inną sekcję kodu na podstawie tej oceny. Jest to dokładnie to, co robi instrukcja if.

Instrukcja if

Oto podstawowy przykład instrukcji if:

$condition = $true
if ( $condition )
{
    Write-Output "The condition was true"
}

Pierwszą rzeczą, jaką wykonuje instrukcja if, jest ocena wyrażenia w nawiasach. Jeśli uzyskuje wartość $true, to wykonuje scriptblock w nawiasach klamrowych. Jeśli wartość wynosiłaby $false, pominąłby ten blok skryptu.

W poprzednim przykładzie instrukcja if właśnie oceniała zmienną $condition. To było $true i wykonałoby polecenie Write-Output wewnątrz bloku skryptu.

W niektórych językach można umieścić pojedynczy wiersz kodu po instrukcji if i zostanie on wykonany. Tak nie jest w programie PowerShell. Musisz podać pełny scriptblock z nawiasami klamrowymi, aby działał poprawnie.

Operatory porównania

Najczęstszym zastosowaniem instrukcji if jest porównanie dwóch elementów ze sobą. Program PowerShell ma specjalne operatory dla różnych scenariuszy porównania. Jeśli używasz operatora porównania, wartość po lewej stronie jest porównywana z wartością po prawej stronie.

-eq dla równości

-eq sprawdza równość między dwiema wartościami, aby upewnić się, że są one równe sobie.

$value = Get-MysteryValue
if ( 5 -eq $value )
{
    # do something
}

W tym przykładzie przyjmujemy znaną wartość 5 i porównuję ją z moimi $value, aby sprawdzić, czy są one zgodne.

Jednym z możliwych przypadków użycia jest sprawdzenie stanu wartości przed podjęciem na niej akcji. Możesz uzyskać usługę i sprawdzić, czy stan był uruchomiony przed wywołaniem Restart-Service.

Jest to powszechne w innych językach, takich jak C#, aby używać == dla równości (np. 5 == $value), ale to nie działa w PowerShell. Innym typowym błędem, jaki popełniają ludzie, jest użycie znaku równości (np. 5 = $value), który jest zarezerwowany do przypisywania wartości do zmiennych. Umieszczając swoją znaną wartość po lewej stronie, sprawia, że błąd staje się bardziej niezręczny.

Ten operator (oraz inne) ma kilka odmian.

  • -eq porównywanie bez uwzględniania wielkości liter
  • -ieq równość bez uwzględniania wielkości liter
  • -ceq równość uwzględniająca wielkość liter

-ne nie jest równe

Wielu operatorów ma odpowiedniego operatora, który sprawdza wynik odwrotny. -ne sprawdza, czy wartości nie są sobie równe.

if ( 5 -ne $value )
{
    # do something
}

Użyj tej opcji, aby upewnić się, że akcja jest wykonywana tylko wtedy, gdy wartość nie jest 5. Przykładem użycia jest sprawdzenie, czy usługa jest uruchomiona, zanim spróbujesz ją uruchomić.

odmiany :

  • -ne bez uwzględniania wielkości liter nie równa się
  • -ine nie równy przy braku uwzględnienia wielkości liter
  • -cne uwzględniana wielkość liter nie jest równa

Są to odwrotne odmiany -eq. Grupuję te typy razem, gdy wyświetlam listę odmian dla innych operatorów.

-gt -ge -lt -le dla większej lub mniejszej niż

Te operatory są używane podczas sprawdzania, czy wartość jest większa lub mniejsza niż inna wartość. -gt -ge -lt -le stać na GreaterThan, GreaterThanOrEqual, LessThan i LessThanOrEqual.

if ( $value -gt 5 )
{
    # do something
}

odmiany:

  • -gt większe niż
  • -igt większe niż bez uwzględniania wielkości liter
  • -cgt większe niż uwzględniana wielkość liter
  • -ge większe lub równe
  • -ige większe lub równe, bez uwzględniania wielkości liter
  • -cge większe niż lub równe, wrażliwe na wielkość liter
  • -lt mniejsze niż
  • -ilt mniejsze niż bez uwzględniania wielkości liter
  • -clt mniejsze niż, uwzględniając wielkość liter
  • -le mniejsze lub równe
  • -ile mniejsze lub równe, bez uwzględniania wielkości liter
  • -cle mniejsze niż lub równe, uwzględniana wielkość liter

Nie wiem, dlaczego dla tych operatorów należy używać opcji uwzględniających wielkość liter i bez uwzględniania wielkości liter.

-dopasowania wzorców z symbolami wieloznacznymi

Program PowerShell ma własną składnię dopasowania wzorców opartą na symbolach wieloznacznych, którą można używać z operatorem -like. Te wzorce wieloznaczne są stosunkowo podstawowe.

  • ? pasuje do dowolnego pojedynczego znaku
  • * pasuje do dowolnej liczby znaków
$value = 'S-ATX-SQL01'
if ( $value -like 'S-*-SQL??')
{
    # do something
}

Ważne jest, aby podkreślić, że wzorzec pasuje do całego ciągu. Jeśli musisz dopasować coś w środku ciągu, musisz umieścić * na obu końcach ciągu.

$value = 'S-ATX-SQL02'
if ( $value -like '*SQL*')
{
    # do something
}

odmiany :

  • -like symbol wieloznaczny bez uwzględniania wielkości liter
  • -ilike symbol wieloznaczny bez uwzględniania wielkości liter
  • -clike symbol wieloznaczny z uwzględnieniem wielkości liter
  • -notlike symbol wieloznaczny bez uwzględniania wielkości liter nie dopasowany
  • -inotlike symbol wieloznaczny bez uwzględniania wielkości liter
  • -cnotlike symbol wieloznaczny z uwzględnieniem wielkości liter nie jest zgodny

-dopasowanie wyrażenia regularnego

Operator -match umożliwia sprawdzenie ciągu pod kątem dopasowania opartego na wyrażeniach regularnych. Użyj tego narzędzia, gdy wzorce z użyciem symboli wieloznacznych nie są wystarczająco elastyczne.

$value = 'S-ATX-SQL01'
if ( $value -match 'S-\w\w\w-SQL\d\d')
{
    # do something
}

Wzorzec wyrażeń regularnych domyślnie pasuje do dowolnego miejsca w ciągu. Możesz więc określić wyrażenie, które chcesz dopasować, w następujący sposób:

$value = 'S-ATX-SQL01'
if ( $value -match 'SQL')
{
    # do something
}

Regex jest złożonym językiem samym w sobie i warto się mu przyjrzeć. Mówię więcej o -match i oraz wielu sposobach używania wyrażeń regularnych (regex) w innym artykule.

odmiany :

  • -match regex bez uwzględniania wielkości liter
  • -imatch wyrażenie regularne bez uwzględniania wielkości liter
  • -cmatch case-sensitive wyrażenie regularne
  • -notmatch regex niezależny od wielkości liter nie został dopasowany
  • -inotmatch niezrównoważony regex bez uwzględniania wielkości liter
  • -cnotmatch nie pasuje do wyrażenia regularnego uwzględniającego wielkość liter

- jest typu

Typ wartości można sprawdzić za pomocą operatora -is.

if ( $value -is [string] )
{
    # do something
}

Można tego użyć, jeśli pracujesz z klasami lub akceptujesz różne obiekty w potoku. Jako dane wejściowe można przedstawić albo usługę, albo nazwę usługi. Następnie sprawdź, czy masz usługę, i uzyskaj ją, jeśli masz tylko jej nazwę.

if ( $Service -isnot [System.ServiceProcess.ServiceController] )
{
    $Service = Get-Service -Name $Service
}

odmiany :

  • -is typu
  • -isnot nie typu

Operatory kolekcji

Jeśli używasz poprzednich operatorów z jedną wartością, wynik jest $true lub $false. Ta funkcja jest obsługiwana nieco inaczej podczas pracy z kolekcją. Każdy element w kolekcji jest oceniany, a operator zwraca każdą wartość, która jest oceniona jako $true.

PS> 1,2,3,4 -eq 3
3

Nadal działa to poprawnie w instrukcji if. Dlatego wartość jest zwracana przez operatora, a następnie cała instrukcja jest $true.

$array = 1..6
if ( $array -gt 3 )
{
    # do something
}

Jest jedna mała pułapka ukryta w szczegółach, którą muszę wskazać. Korzystając z operatora -ne w ten sposób, łatwo omyłkowo spojrzeć na logikę od tyłu. Użycie -ne z kolekcją zwraca $true, jeśli którykolwiek element w kolekcji nie jest zgodny z twoją wartością.

PS> 1,2,3 -ne 4
1
2
3

Może to wyglądać jak sprytna sztuczka, ale mamy operatory -contains i -in, które obsługują to wydajniej. I -notcontains robi to, czego oczekujesz.

-zawiera

Operator -contains sprawdza kolekcję w poszukiwaniu wartości. Gdy tylko znajdzie dopasowanie, zwraca $true.

$array = 1..6
if ( $array -contains 3 )
{
    # do something
}

Jest to preferowany sposób sprawdzenia, czy kolekcja zawiera twoją wartość. Użycie Where-Object (lub -eq) powoduje, że każdorazowe przejście przez całą listę jest znacznie wolniejsze.

odmiany :

  • -contains dopasowania bez uwzględniania wielkości liter
  • -icontains dopasowania bez uwzględniania wielkości liter
  • -ccontains dopasowania uwzględniające wielkość liter
  • -notcontains nie dopasowano bez uwzględniania wielkości liter
  • -inotcontains nie pasuje bez uwzględniania wielkości liter
  • -cnotcontains uwzględniana wielkość liter nie jest zgodna

-w

Operator -in jest podobny do operatora -contains, z tą różnicą, że kolekcja znajduje się po prawej stronie.

$array = 1..6
if ( 3 -in $array )
{
    # do something
}

odmiany :

  • -in dopasowania bez uwzględniania wielkości liter
  • -iin dopasowanie niewrażliwe na wielkość liter
  • -cin dopasowania uwzględniające wielkość liter
  • -notin niepasujący do wzorca bez uwzględniania wielkości liter
  • -inotin nie dopasowano bez uwzględniania wielkości liter
  • -cnotin rozróżnianie wielkości liter nie pasuje

Operatory logiczne

Operatory logiczne służą do odwracania lub łączenia innych wyrażeń.

-nie

Operator -not przerzuca wyrażenie z $false na $true lub z $true do $false. Oto przykład, w którym chcemy wykonać akcję, gdy Test-Path jest $false.

if ( -not ( Test-Path -Path $path ) )

Większość operatorów, o których mówiliśmy, ma odmianę, w której nie trzeba używać operatora -not. Ale są jeszcze czasy, które są przydatne.

! operator

Możesz użyć ! jako aliasu dla -not.

if ( -not $value ){}
if ( !$value ){}

Możesz zauważyć, że ! jest częściej używaną przez osoby mówiące w innych językach, takich jak C#. Wolę go wpisać, ponieważ trudno mi go dostrzec, gdy szybko patrzę na moje skrypty.

-i

Wyrażenia można łączyć z operatorem -and. Gdy to zrobisz, obie strony muszą być $true, aby całe wyrażenie było $true.

if ( ($age -gt 13) -and ($age -lt 55) )

W tym przykładzie $age musi mieć wartość 13 lub starszą dla lewej strony i mniej niż 55 dla prawej strony. Dodano dodatkowe nawiasy, aby wyjaśnić to w tym przykładzie, ale są opcjonalne tak długo, jak wyrażenie jest proste. Oto ten sam przykład bez nich.

if ( $age -gt 13 -and $age -lt 55 )

Ocena odbywa się od lewej do prawej. Jeśli pierwszy element zwróci wartość $false, proces kończy się wcześniej i nie przeprowadza właściwego porównania. Jest to przydatne, gdy musisz upewnić się, że wartość istnieje przed jego użyciem. Na przykład Test-Path zgłasza błąd, jeśli nadasz mu ścieżkę $null.

if ( $null -ne $path -and (Test-Path -Path $path) )

-lub

-or umożliwia określenie dwóch wyrażeń i zwrócenie $true, jeśli jeden z nich jest $true.

if ( $age -le 13 -or $age -ge 55 )

Podobnie jak w przypadku operatora -and ocena odbywa się od lewej do prawej. Z tą różnicą, że jeśli pierwsza część jest $true, cała instrukcja jest $true i nie przetwarza pozostałej części wyrażenia.

Zwróć również uwagę na sposób działania składni dla tych operatorów. Potrzebujesz dwóch oddzielnych wyrażeń. Widziałem, jak użytkownicy próbują zrobić coś takiego $value -eq 5 -or 6, nie zdając sobie sprawy z ich błędu.

-xor wyłączność lub

Jest to trochę niezwykłe. -xor pozwala na obliczenie tylko jednego wyrażenia w kontekście $true. Więc jeśli oba elementy są $false lub oba elementy są $true, całe wyrażenie jest $false. Innym sposobem spojrzenia na to jest, że wyrażenie jest to $true tylko wtedy, gdy wyniki wyrażenia są inne.

Rzadko zdarza się, że ktoś kiedykolwiek używa tego operatora logicznego i nie mogę myśleć o dobrym przykładzie, dlaczego kiedykolwiek go używam.

Operatory bitowe

Operatory bitowe wykonują obliczenia na bitach w danych i w wyniku generują nową wartość. Nauczanie operatorów bitowych wykracza poza zakres tego artykułu, ale przedstawiamy listę tych operatorów.

  • -band binarne I
  • -bor binarne OR
  • -bxor binarna alternatywa wykluczająca (XOR)
  • -bnot binarne NIE
  • -shl przesunięcie w lewo
  • -shr przesunięcie w prawo

Wyrażenia programu PowerShell

Możemy użyć normalnego programu PowerShell w instrukcji warunku.

if ( Test-Path -Path $Path )

Test-Path zwraca $true lub $false w trakcie wykonywania. Dotyczy to również poleceń, które zwracają inne wartości.

if ( Get-Process Notepad* )

Wartość wynosi $true, jeśli proces jest zwracany, i $false, jeśli nie jest. Całkowicie dopuszczalne jest użycie wyrażeń potoku lub innych instrukcji programu PowerShell, takich jak te:

if ( Get-Process | where Name -EQ Notepad )

Te wyrażenia można łączyć ze sobą za pomocą operatorów -and i -or, ale może być konieczne użycie nawiasów, aby podzielić je na podwyrażenia.

if ( (Get-Process) -and (Get-Service) )

Sprawdzanie, czy jest $null

Brak wyniku lub wartość $null jest oceniane jako $false w wyrażeniu if. Podczas sprawdzania specjalnie w kontekście $nullnajlepszym rozwiązaniem jest umieszczenie $null po lewej stronie.

if ( $null -eq $value )

Istnieje kilka niuansów podczas pracy z wartościami $null w programie PowerShell. Jeśli interesuje Cię zgłębienie tego tematu, mam artykuł o wszystko, co chciałeś wiedzieć o $null.

Przypisanie zmiennej wewnątrz warunku

Prawie zapomniałem dodać ten jeden, dopóki Prasoon Karunan V mi o nim nie przypomniał.

if ($process=Get-Process notepad -ErrorAction Ignore) {$process} else {$false}

Zwykle, gdy przypisujesz wartość do zmiennej, wartość ta nie jest przekazywana do potoku czy konsoli. Podczas przypisywania zmiennej w wyrażeniu podrzędnym zostaje ona przekazana do potoku.

PS> $first = 1
PS> ($second = 2)
2

Zobacz, jak przypisanie $first nie ma danych wyjściowych, a przypisanie $second działa? Po wykonaniu przypisania w instrukcji if zostanie ono wykonane dokładnie tak samo jak przypisanie $second powyżej. Oto czysty przykład dotyczący sposobu używania go:

if ( $process = Get-Process Notepad* )
{
    $process | Stop-Process
}

Jeśli $process zostanie przypisana wartość, instrukcja zostanie $true i $process zostanie zatrzymana.

Upewnij się, że nie należy tego mylić z -eq, ponieważ nie jest to sprawdzanie równości. Jest to mniej znana funkcja, z której działania większość ludzi nie zdaje sobie sprawy.

Przypisanie zmiennej z bloku skryptów

Możesz również użyć bloku skryptu if, aby przypisać wartość do zmiennej.

$discount = if ( $age -ge 55 )
{
    Get-SeniorDiscount
}
elseif ( $age -le 13 )
{
    Get-ChildDiscount
}
else
{
    0.00
}

Każdy blok skryptu zapisuje wyniki poleceń lub wartość jako dane wyjściowe. Możemy przypisać wynik instrukcji if do zmiennej $discount. Przykład mógł równie łatwo przypisać te wartości bezpośrednio do zmiennej $discount w każdym bloku skryptu. Nie mogę twierdzić, że często używam tego w połączeniu z instrukcją if, ale mam przykład, który ostatnio zastosowałem.

Alternatywna ścieżka wykonania

Instrukcja if umożliwia określenie akcji nie tylko wtedy, gdy instrukcja jest $true, ale także w przypadku, gdy jest $false. W tym miejscu pojawia się deklaracja else.

inaczej

Instrukcja else jest zawsze ostatnią częścią instrukcji if, gdy jest używana.

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."
}

W tym przykładzie sprawdzamy $path, aby upewnić się, że jest to plik. Jeśli znajdziemy plik, przeniesiemy go. Jeśli nie, napiszemy ostrzeżenie. Ten typ logiki rozgałęziania jest bardzo powszechny.

Zagnieżdżony if

Instrukcje if i else blokują skrypt, dzięki czemu możemy umieścić w nich dowolne polecenie programu PowerShell, w tym inną instrukcję if. Dzięki temu można korzystać z znacznie bardziej skomplikowanej logiki.

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."
    }
}

W tym przykładzie najpierw przetestujemy szczęśliwą ścieżkę, a następnie podejmiemy na niej działania. Jeśli to się nie powiedzie, wykonamy kolejne sprawdzenie i udostępnimy użytkownikowi bardziej szczegółowe informacje.

elseif

Nie ograniczamy się tylko do pojedynczego sprawdzenia warunkowego. Możemy połączyć instrukcje if i else zamiast je zagnieżdżać, używając instrukcji elseif.

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."
}

Wykonanie odbywa się od góry do dołu. Najpierw oceniana jest najwyższa instrukcja if. Jeśli jest to $false, przemieszcza się w dół do następnego elseif lub else na liście. Ta ostatnia else jest domyślną akcją do wykonania, jeśli żadna z innych osób nie zwróci $true.

przełącznik

W tym momencie muszę wspomnieć o oświadczeniu switch. Zapewnia on alternatywną składnię do wykonywania wielu porównań z wartością. W przypadku switchnależy określić wyrażenie i wynik jest porównywany z kilkoma różnymi wartościami. Jeśli jedna z tych wartości jest zgodna, zostanie wykonany pasujący blok kodu. Przyjrzyj się temu przykładowi:

$itemType = 'Role'
switch ( $itemType )
{
    'Component'
    {
        'is a component'
    }
    'Role'
    {
        'is a role'
    }
    'Location'
    {
        'is a location'
    }
}

Istnieją trzy możliwe wartości, które mogą być zgodne z $itemType. W tym przypadku zgadza się z Role. Użyłem prostego przykładu, aby zapoznać cię z operatorem switch. Więcej na temat wszystkiego, co chcesz wiedzieć o instrukcji switch znajdziesz w innym artykule.

Tablica w tekście

Mam funkcję o nazwie Invoke-SnowSql, która uruchamia plik wykonywalny z kilkoma argumentami wiersza polecenia. Oto klip z tej funkcji, w którym kompiluję tablicę argumentów.

$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
    }
)

Zmienne $Debug i $Path to parametry funkcji udostępnianej przez użytkownika końcowego. Oceniam je bezpośrednio podczas inicjowania mojej tablicy. Jeśli $Debug ma wartość true, te wartości należą do $snowSqlParam we właściwym miejscu. To samo dotyczy zmiennej $Path.

Upraszczanie złożonych operacji

Nieuniknione jest, że napotkasz sytuację, w której będzie za dużo porównań do przeanalizowania, a wtedy instrukcja if przesuwa się daleko poza prawą krawędź ekranu.

$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
}

Mogą być trudne do odczytania i sprawiają, że jesteś bardziej podatny na błędy. Istnieje kilka rzeczy, które możemy z tym zrobić.

Kontynuacja wiersza

Niektóre operatory w programie PowerShell umożliwiają zawijanie polecenia do następnego wiersza. Operatory logiczne -and i -or są dobrymi operatorami do użycia, jeśli chcesz podzielić wyrażenie na wiele wierszy.

if ($null -ne $user -and
    $user.Department -eq 'Finance' -and
    $user.Title -match 'Senior' -and
    $user.HomeDrive -notlike '\\server\*'
)
{
    # Do Something
}

Jest tam jeszcze wiele się dzieje, ale umieszczenie każdego elementu w osobnym wierszu robi dużą różnicę. Zazwyczaj używam tego, gdy otrzymuję więcej niż dwa porównania lub jeśli muszę przewinąć do prawej strony, aby przeczytać dowolną logikę.

Wstępne obliczanie wyników

Możemy wyjąć to stwierdzenie z instrukcji if i sprawdzić tylko wynik.

$needsSecureHomeDrive = $null -ne $user -and
    $user.Department -eq 'Finance' -and
    $user.Title -match 'Senior' -and
    $user.HomeDrive -notlike '\\server\*'

if ( $needsSecureHomeDrive )
{
    # Do Something
}

Przy tym po prostu ma się wrażenie większej czystości niż w poprzednim przykładzie. Masz również możliwość użycia nazwy zmiennej, która wyjaśnia, co faktycznie sprawdzasz. Jest to również przykład kodu samodzielnego dokumentowania, który zapisuje niepotrzebne komentarze.

Wiele instrukcji if

Możemy podzielić to na wiele twierdzeń i sprawdzić każde z osobna. W takim przypadku używamy flagi lub zmiennej śledzenia, aby połączyć wyniki.


$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
}

Musiałem odwrócić logikę, aby logika flagi działała poprawnie. Każda ocena jest indywidualnym oświadczeniem if. Zaletą tego jest to, że podczas debugowania można dokładnie określić, co robi logika. W tym samym czasie udało mi się dodać znacznie lepszą szczegółowość.

Oczywistym minusem jest to, że jest to o wiele więcej kodu do pisania. Kod wydaje się bardziej złożony, ponieważ rozbija pojedynczy wiersz logiki na 25 lub więcej wierszy.

Korzystanie z funkcji

Możemy również przenieść całą tę logikę weryfikacji do funkcji. Zobacz, jak czyste wygląda to na pierwszy rzut oka.

if ( Test-SecureDriveConfiguration -ADUser $user )
{
    # do something
}

Nadal trzeba utworzyć funkcję do przeprowadzenia walidacji, ale ułatwia to pracę z tym kodem. Ułatwia testowanie tego kodu. Podczas testów można zamockować wywołanie Test-ADDriveConfiguration, a do tej funkcji musisz mieć tylko dwa testy. Jeden, w którym zwraca $true i taki, w którym zwraca $false. Testowanie drugiej funkcji jest prostsze, ponieważ jest bardzo mała.

Treść tej funkcji może być nadal jednowierszowa, od której zaczęliśmy, lub z rozszerzoną logiką, której użyliśmy w ostatniej sekcji. Działa to dobrze w obu scenariuszach i umożliwia łatwą zmianę tej implementacji później.

Obsługa błędów

Jednym z ważnych zastosowań instrukcji if jest sprawdzenie warunków błędu przed wystąpieniami błędów. Dobrym przykładem jest sprawdzenie, czy folder już istnieje przed próbą jego utworzenia.

if ( -not (Test-Path -Path $folder) )
{
    New-Item -Type Directory -Path $folder
}

Lubię powiedzieć, że jeśli spodziewasz się wystąpienia wyjątku, to nie jest to naprawdę wyjątek. Sprawdź więc swoje wartości i zweryfikuj warunki, w których możesz.

Jeśli chcesz bardziej szczegółowo zapoznać się z rzeczywistą obsługą wyjątków, mam artykuł na temat wszystkiego, co kiedykolwiek chcieliście wiedzieć o wyjątkach.

Końcowe wyrazy

Instrukcja if jest tak prostą instrukcją, ale jest podstawowym elementem programu PowerShell. Będziesz używać tego wiele razy w prawie każdym pisaniu skryptu. Mam nadzieję, że masz lepsze zrozumienie niż wcześniej.