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 $true
wartość , 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 5
jest 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
$false
elementu .
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
$true
wartość .
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 $true
wartość . 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 $null
elementu 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 $false
to . 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 $true
wartoś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 switch
należ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.
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla