Wszystko, co chciałeś wiedzieć o instrukcji 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 napisanym 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 if robi instrukcja.

Instrukcja if

Oto podstawowy przykład instrukcji if :

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

Pierwszą rzeczą, jaką if wykonuje instrukcja, jest ocena wyrażenia w nawiasach. Jeśli wartość zostanie obliczona na $truewartość , zostanie wykonana wartość scriptblock w nawiasach klamrowych. Jeśli wartość to $false, to spowoduje to pominięcie tego skryptblocku.

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

W niektórych językach można umieścić pojedynczy wiersz kodu po instrukcji if i jest wykonywany. Tak nie jest w programie PowerShell. Należy podać pełne scriptblock nawiasy klamrowe, aby działały poprawnie.

Operatory porównania

Najczęstszym zastosowaniem if instrukcji 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

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

$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 jej uruchomieniem Restart-Service .

Jest to powszechne w innych językach, takich jak C# do użycia == na potrzeby równości (np. 5 == $value) ale nie działa z programem PowerShell. Innym typowym błędem, jaki popełniają ludzie, jest użycie znaku równości (np. 5 = $value) zarezerwowanego 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 (i inne) ma kilka odmian.

  • -eq równość bez uwzględniania wielkości liter
  • -ieq równość bez uwzględniania wielkości liter
  • -ceq równość z uwzględnieniem wielkości liter

-ne nie jest równe

Wiele operatorów ma powiązany operator, który sprawdza wynik przeciwny. -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 5jest wartością . Dobre przypadki użycia, w których należy sprawdzić, czy usługa była w stanie uruchomienia, zanim spróbujesz go uruchomić.

Zmiany:

  • -ne bez uwzględniania wielkości liter nie jest równe
  • -ine bez uwzględniania wielkości liter nie jest równe
  • -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ść. Stoisko -gt -ge -lt -le GreaterThan, GreaterThanOrEqual, LessThan i LessThanOrEqual.

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

Zmiany:

  • -gt większe niż
  • -igt większe niż, bez uwzględniania wielkości liter
  • -cgt większe niż, z uwzględnieniem wielkości liter
  • -ge większe niż lub równe
  • -ige większe niż lub równe, bez uwzględniania wielkości liter
  • -cge większe niż lub równe, uwzględniana wielkość liter
  • -lt mniejsze niż
  • -ilt mniejsze niż, bez uwzględniania wielkości liter
  • -clt mniejsze niż, uwzględniana wielkość liter
  • -le mniejsze niż lub równe
  • -ile mniejsze niż 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.

-jak dopasowania symboli wieloznacznych

Program PowerShell ma własną składnię dopasowywania wzorca opartego na symbolach wieloznacznych i można go używać z operatorem -like . Te wzorce wieloznaczne są dość 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ć element * na obu końcach ciągu.

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

Zmiany:

  • -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
  • -inotlike symbol wieloznaczny bez uwzględniania wielkości liter
  • -cnotlike symbol wieloznaczny z uwzględnieniem wielkości liter nie jest zgodny

-match wyrażenie regularne

Operator -match umożliwia sprawdzenie ciągu pod kątem dopasowania opartego na wyrażeniach regularnych. Użyj tej funkcji, gdy wzorce wieloznaczne 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ć podciąg, który ma być dopasowany w następujący sposób:

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

Regex jest złożonym językiem własnego i warto przyjrzeć się. Mówię więcej o -match i wiele sposobów używania wyrażenia regularnego w innym artykule.

Zmiany:

  • -match bez uwzględniania wielkości liter
  • -imatch bez uwzględniania wielkości liter
  • -cmatch wyrażeń regularnych z uwzględnieniem wielkości liter
  • -notmatch bez uwzględniania wielkości liter nie jest dopasowana
  • -inotmatch bez uwzględniania wielkości liter nie jest dopasowana
  • -cnotmatch Wielkość liter nie jest dopasowywana do wyrażenia regularnego

- jest typu

Możesz sprawdzić typ wartości za pomocą -is operatora .

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że być wyświetlana nazwa usługi lub usługi. Następnie sprawdź, czy masz usługę i pobierz usługę, jeśli masz tylko nazwę.

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

Zmiany:

  • -is typu
  • -isnot nie jest typu

Operatory kolekcji

Jeśli używasz poprzednich operatorów z jedną wartością, wynik to $true lub $false. Ta funkcja jest obsługiwana nieco inaczej podczas pracy z kolekcją. Każdy element w kolekcji jest obliczany, a operator zwraca każdą wartość, która daje wartość .$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 to $true.

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

Jest jedna mała pułapka ukrywana w szczegółach, które muszę podkreślić. Korzystając z -ne operatora w ten sposób, łatwo jest omyłkowo przyjrzeć się logiki do tyłu. Użycie funkcji -ne z kolekcją zwraca $true wartość, jeśli jakikolwiek 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 że obsługują to wydajniej. I -notcontains robi to, czego oczekujesz.

-Zawiera

Operator -contains sprawdza kolekcję dla twojej wartości. Gdy tylko znajdzie dopasowanie, zwraca wartość $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 metody (lub -eq) przeprowadza całą listę za każdym razem i jest znacznie wolniejsze.

Zmiany:

  • -contains dopasowanie bez uwzględniania wielkości liter
  • -icontains dopasowanie bez uwzględniania wielkości liter
  • -ccontains Dopasowanie uwzględniające wielkość liter
  • -notcontains bez uwzględniania wielkości liter
  • -inotcontains bez uwzględniania wielkości liter
  • -cnotcontains uwzględniana wielkość liter nie jest dopasowana

-Cala

Operator -in jest podobnie jak operator, -contains z wyjątkiem kolekcji znajduje się po prawej stronie.

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

Zmiany:

  • -in dopasowanie bez uwzględniania wielkości liter
  • -iin dopasowanie bez uwzględniania wielkości liter
  • -cin Dopasowanie uwzględniające wielkość liter
  • -notin bez uwzględniania wielkości liter
  • -inotin bez uwzględniania wielkości liter
  • -cnotin uwzględniana wielkość liter nie jest dopasowana

Operatory logiczne

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

-Nie

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

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ć -not operatora. Ale są jeszcze czasy, które są przydatne.

! operator

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

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

Możesz zobaczyć ! , że więcej osób pochodzi z innych języków, takich jak C#. Wolę go wpisać, ponieważ trudno mi zobaczyć, gdy szybko patrzy na moje skrypty.

-I

Wyrażenia można łączyć z operatorem -and . Gdy to zrobisz, obie strony muszą mieć $true$truewartość .

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, kończy się wcześnie i nie wykonuje odpowiedniego porównania. Jest to przydatne, gdy musisz upewnić się, że wartość istnieje przed jego użyciem. Na przykład zgłasza błąd, Test-Path jeśli nadasz mu ścieżkę $null .

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

-Lub

Parametr -or umożliwia określenie dwóch wyrażeń i zwraca $true wartość , jeśli jeden z nich to $true.

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

Podobnie jak w przypadku -and operatora, ocena odbywa się od lewej do prawej. Z tą różnicą, że jeśli pierwsza część to $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 umożliwia obliczenie tylko jednego wyrażenia na $truewartość . Więc jeśli oba elementy są $false lub oba elementy to $true, całe wyrażenie to $false. Innym sposobem na przyjrzenie się temu jest wyrażenie tylko $true 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 wartościach i generują nową wartość w wyniku. Nauczanie operatorów bitowych wykracza poza zakres tego artykułu, ale oto lista tych operatorów .

  • -band binarne AND
  • -bor binarne OR
  • -bxor binary exclusive OR
  • -bnot binarne NOT
  • -shl shift w lewo
  • -shr shift w prawo

Wyrażenia programu PowerShell

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

if ( Test-Path -Path $Path )

Test-Path funkcja zwraca $true lub $false gdy jest wykonywana. Dotyczy to również poleceń, które zwracają inne wartości.

if ( Get-Process Notepad* )

Ocenia, $true czy jest zwracany proces, a $false jeśli tak nie jest. Doskonale sprawdza się, czy używać wyrażeń potoku lub innych instrukcji programu PowerShell w następujący sposób:

if ( Get-Process | Where Name -eq Notepad )

Te wyrażenia można łączyć ze sobą z operatorami -and i -or , ale może być konieczne użycie nawiasów w celu podzielenia ich na podexpressiony.

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

Sprawdzanie $null

Brak wyniku lub $null wartość jest obliczana $false w instrukcji if . Podczas sprawdzania specjalnie dla $nullelementu najlepszym rozwiązaniem jest umieszczenie elementu $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ę zagłębienie się w głębiej, mam artykuł na temat wszystkiego, co chciałeś wiedzieć o $null.

Przypisanie zmiennej w warunku

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

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

Zwykle podczas przypisywania wartości do zmiennej wartość nie jest przekazywana do potoku ani konsoli. Podczas przypisywania zmiennej w wyrażeniu podrzędnym jest on przekazywany do potoku.

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

Zobacz, jak $first przypisanie nie ma danych wyjściowych $second i czy przypisanie działa? Gdy przypisanie zostanie wykonane w instrukcji if , zostanie wykonane tak samo jak $second powyższe przypisanie. 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 to i $true$process zostanie zatrzymana.

Upewnij się, że nie należy tego mylić, -eq ponieważ nie jest to sprawdzanie równości. Jest to bardziej niejasna funkcja, której większość ludzi nie zdaje sobie sprawy, działa w ten sposób.

Przypisanie zmiennej z bloku skryptów

Możesz również użyć skryptblock instrukcji 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 . Ten przykład może mieć tak samo łatwe przypisanie tych wartości do zmiennej $discount bezpośrednio w każdym skryblokcie. Nie mogę powiedzieć, że używam tego z instrukcją if często, ale mam przykład, w którym ostatnio używałem tego.

Alternatywna ścieżka wykonywania

Instrukcja if umożliwia określenie akcji nie tylko wtedy, gdy instrukcja to $true, ale także w przypadku, gdy jest $falseto . W tym miejscu else wchodzi w grę instrukcja.

else

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 sprawdzimy element , $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żone, jeśli

Instrukcje if i else przyjmują blok skryptu, więc możemy umieścić w nich dowolne polecenie programu PowerShell, w tym inną if instrukcję. 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ć łańcuch if i else instrukcje zamiast zagnieżdżać je za pomocą 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. Pierwsza instrukcja jest oceniana jako górna if . Jeśli tak jest $false, zostanie przeniesiony 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 nie zwróci $truewartości .

switch

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

$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 takim przypadku jest on zgodny z parametrem Role. Użyłem prostego przykładu, aby dać ci pewną ekspozycję switch na operatora. Mówię więcej o wszystkim, co kiedykolwiek chciałeś wiedzieć o instrukcji switch 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 w tekście wewnątrz inicjowania mojej tablicy. Jeśli $Debug wartość ma wartość true, te wartości należą do $snowSqlParam poprawnego miejsca. To samo dotyczy zmiennej $Path .

Upraszczanie złożonych operacji

Nieuniknione jest, że wpadniesz w sytuację, która ma zbyt wiele porównań, aby sprawdzić, a instrukcja If przewija się z prawej strony 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 i -or są dobrymi operatorami -and 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 jeszcze wiele dzieje się tam, ale umieszczenie każdego kawałka na własnej linii sprawia, że duża różnica. 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
}

To po prostu czuje się znacznie czystsze niż w poprzednim przykładzie. Masz również możliwość użycia nazwy zmiennej, która wyjaśnia, co to jest to, że naprawdę sprawdzasz. Jest to również przykład kodu samodzielnego dokumentowania, który zapisuje niepotrzebne komentarze.

Wiele instrukcji if

Możemy podzielić to na wiele instrukcji i sprawdzić je pojedynczo. 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 pojedynczą if instrukcją. 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 jest bardziej złożony, aby przyjrzeć się temu, jak przyjmuje pojedynczy wiersz logiki i eksploduje go do 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. W testach można wyśmiewać wywołanie Test-ADDriveConfiguration i potrzebujesz tylko dwóch testów dla tej funkcji. Jeden, w którym zwraca wartość $true , a drugi, gdzie zwraca wartość $false. Testowanie drugiej funkcji jest prostsze, ponieważ jest tak małe.

Treść tej funkcji może być nadal taka, że jeden liniowiec zaczęliśmy od lub eksplodowanej logiki, 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 chciałeś 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.