stejně Jako mnoho jiných jazyků, PowerShell má prohlášení pro podmíněně spuštění kódu ve skriptech. Jedním z těchto tvrzení je prohlášení if. Dnes se hluboce ponoříme do jednoho z nejzákladnějších příkazů v PowerShell.,
- Index
- Podmíněné provedení
- if
- relační operátory
- -eq pro rovnost
- -ne není rovno
- -gt,- ge,- lt,- le pro větší nebo menší než
- -jako zástupný znak odpovídá
- -odpovídají regulární výraz
- -je typu
- -eq pro rovnost
- Kolekce operátory
- -obsahuje
- -v
- Logické operátory
- -ne
- !,pressions
- Kontrola za $null
- přiřazení Proměnné
- Alternativní cestu spuštění
- ostatní
- Vnořený
- elseif
- switch
- Potrubí
- Pole inline
- Zjednodušit složité operace
- pokračování
- Pre-výpočtu výsledků
- Více if
- Pomocí funkce
- zpracování Chyb
- Závěrečná slova
Podmíněné provedení
Vaše scénáře bude často nutné, aby se rozhodnutí a plnit různé logiky na základě těchto rozhodnutí., To je to, co mám na mysli podmíněným provedením. Máte jeden příkaz nebo hodnotu vyhodnotit, pak spustit různé části kódu na základě tohoto hodnocení. To je přesně to, co dělá příkaz
if
.if
Zde je velmi základní příklad
if
prohlášení:$condition = $true if ( $condition ) { Write-Output "The condition was true" }
první věc,
if
prohlášení se je vyhodnotit výraz v závorkách., Pokud se vyhodnotí na$true
, provedescriptblock
v závorkách. Pokud by hodnota byla$false
, přeskočilo by to přes tento scriptblock.v předchozím příkladu příkaz
if
právě hodnotil proměnnou$condition
. Bylo to$true
a provedlo by příkazWrite-Output
uvnitř scriptblocku.V některých jazycích, můžete umístit jeden řádek kódu po
if
prohlášení a to bude vykonán., V PowerShellu tomu tak není. Musíte poskytnout úplnéscriptblock
s příchytkami, aby fungovaly správně.srovnávací operátory
nejčastější věcí, kterou použijete
if
, je porovnání dvou položek mezi sebou. Powershell má speciální operátory pro různé srovnávací scénáře. Při použití srovnávacího operátora se hodnota na levé straně porovnává s hodnotou na pravé straně.,-eq pro rovnost
-eq
má rovnosti zkontrolujte, zda mezi dvěma hodnotami, aby se ujistil, že jsou rovné i sobě navzájem.$value = Get-MysteryValue if ( 5 -eq $value ) { # do something }
V tomto příkladu, beru známé hodnoty
5
porovnání$value
uvidíme, jestli se shodují.jedním z možných použití je zkontrolovat stav hodnoty před provedením akce. Mohli byste získat službu a zkontrolovat, zda byl stav spuštěn dříve, než jste na něj zavolali
Restart-Service
.,je běžné, Že v jiných jazycích, jako je C# použít
==
pro rovnost (ex:5 == $value
), ale to neznamená, práce s powershell. Další častou chybou, kterou lidé dělají, je použití znaménka rovnosti (např.:5 = $value
), které je vyhrazeno pro přiřazení hodnot proměnným. Umístěním své známé hodnoty na levé straně, to dělá, že mylný více trapné, aby se.tento operátor (a další) má několik variant.,
-
-eq
malá a velká písmena rovnosti -
-ieq
malá a velká písmena rovnosti -
-ceq
case sensitive rovnosti
-ne není rovno
Mnozí operátoři související subjekt, který je běžný pro opačný výsledek.
-ne
ověří hodnoty, které se navzájem nerovná.if ( 5 -ne $value ) { # do something }
Použít, aby se ujistil, že akce se provede pouze pokud není hodnota
5
., Dobré použití-případy, kdy by bylo zkontrolovat, zda je služba v provozním stavu, než se pokusíte ji spustit.Varianty:
-
-ne
malá a velká písmena není rovno -
-ine
malá a velká písmena není rovno -
-cne
case sensitive není rovno
to jsou jen inverzní variace
-eq
. Tyto typy seskupím, když uvedu varianty pro jiné operátory.,– gt-ge-lt-le pro větší nebo menší než
tyto operátory se používají při kontrole, zda je hodnota větší nebo menší než jiná hodnota.
-gt -ge -lt -le
stojan pro Větší, GreaterThanOrEqual, LessThan, a LessThanOrEqual.,jedlík než nebo rovno, malá a velká písmena - !,pressions
-
-cge
větší než nebo rovno, velká a malá písmena -
-lt
méně než -
-ilt
menší než, malá a velká písmena -
-clt
méně než, velká a malá písmena -
-le
menší než nebo rovno -
-ile
menší než nebo rovno, malá a velká písmena -
-cle
menší než nebo rovno, velká a malá písmena
já nevím, proč jsi použil případě citlivé a necitlivé možnosti pro tyto subjekty.,
-jako zástupné zápasy
PowerShell má svou vlastní syntaxi na základě zástupných znaků a můžete ji použít s operátorem
-like
. Tyto zástupné vzory jsou poměrně základní.-
?
bude odpovídat jeden znak -
*
bude odpovídat libovolný počet znaků
$value = 'S-ATX-SQL01' if ( $value -like 'S-*-SQL??') { # do something }
Je důležité poukázat na to, že se shoduje celý řetězec., Pokud potřebujete něco shodovat uprostřed řetězce, budete muset umístit
*
na oba konce řetězce.,iv> - -ne
Varianty:
-
-like
malá a velká písmena zástupný znak -
-ilike
malá a velká písmena zástupný znak -
-clike
case sensitive zástupný znak -
-notlike
malá a velká písmena zástupné není uzavřeno -
-inotlike
malá a velká písmena zástupné není uzavřeno -
-cnotlike
case sensitive zástupné není uzavřeno
-match regulárním výrazem
-match
provozovatel umožňuje zkontrolovat řetězec pro regulární výraz na zápas., Použijte to, když zástupné vzory nejsou dostatečně flexibilní pro vás.
$value = 'S-ATX-SQL01' if ( $value -match 'S-\w\w\w-SQL\d\d') { # do something }
vzorec regexu se ve výchozím nastavení shoduje kdekoli v řetězci. Tak můžete zadat řetězec, který chcete uzavřeno jako toto:
$value = 'S-ATX-SQL01' if ( $value -match 'SQL') { # do something }
Regex je složitý jazyk jeho vlastní, a stojí za to díval do. Mluvím více o -match
a mnoha způsobech použití regexu v jiném článku.,
Variations:
-
-match
case insensitive regex -
-imatch
case insensitive regex -
-cmatch
case sensitive regex -
-notmatch
case insensitive regex not matched -
-inotmatch
case insensitive regex not matched -
-cnotmatch
case sensitive regex not matched
-is of type
You are able to check a value’s type with the -is
operator.,
if ( $value -is ) { # do something }
můžete použít, když budete pracovat s třídami, nebo přijímá různé objekty přes potrubí. Jako vstup můžete mít buď službu nebo název služby. Poté zkontrolujte, zda máte službu a načtěte službu, pokud máte pouze jméno.,
if ( $Service -isnot ) { $Service = Get-Service -Name $Service }
Varianty:
-
-is
typ -
-isnot
typu
Sbírka operátorů
Při použití předchozí provozovatelé, s jedinou hodnotou, výsledek je $true
nebo $false
. Při práci se sbírkou se s tím zachází trochu jinak. Každá položka ve sbírce se vyhodnotí a operátor místo toho vrátí každou hodnotu, která se vyhodnotí na $true
.,
PS> 1,2,3,4 -eq 3 3
To stále funguje správně v if
prohlášení. Takže hodnota je vrácena operátorem, pak celé prohlášení je $true
.
$array = 1..6 if ( $array -gt 3 ) { # do something }
v detailech se skrývá jedna malá past, na kterou musím poukázat. Při použití-ne
operátora tímto způsobem je snadné se mylně podívat na logiku dozadu., Použití -ne
se sbírkou vrátí $true
pokud nějaká položka ve sbírce neodpovídá vaší hodnotě.
PS> 1,2,3 -ne 4 1 2 3
To může vypadat jako chytrý trik, ale máme operátory -contains
-in
to zvládnout efektivněji a -notcontains
bude správně dělat to, co můžete očekávat.
-obsahuje
-contains
operátor zkontroluje sběr vaší hodnoty., Jakmile najde shodu, vrátí $true
.
$array = 1..6 if ( $array -contains 3 ) { # do something }
Toto je preferovaný způsob, jak zjistit, zda kolekce obsahuje hodnotu. Použití Where-Object
( nebo -eq
) bude procházet celý seznam pokaždé a bude výrazně pomalejší.,
Varianty:
-
-contains
malá a velká písmena zápas -
-icontains
malá a velká písmena zápas -
-ccontains
case sensitive match -
-notcontains
malá a velká písmena není uzavřeno -
-inotcontains
malá a velká písmena není uzavřeno -
-cnotcontains
case sensitive není uzavřeno
-v
-in
operátor je jako -contains
provozovatel, s výjimkou kolekce je na pravé straně.,
$array = 1..6 if ( 3 -in $array ) { # do something }
Variations:
-
-in
case insensitive match -
-iin
case insensitive match -
-cin
case sensitive match -
-notin
case insensitive not matched -
-inotin
case insensitive not matched -
-cnotin
case sensitive not matched
Logical operators
Logical operators are used to invert or combine other expressions.,
-ne
-not
operátor překlopí výraz z $false
$true
nebo $true
$false
. Zde je příklad, kdy chceme provést akci, když Test-Path
je $false
.
if ( -not ( Test-Path -Path $path ) )
Většina provozovatelů mluvili jsme o tom mám variantu, kde by nebylo nutné použít -not
operátora, ale tam jsou ještě časy, měli byste použít.
!,
můžete použít !
jako alias pro -not
.
if ( -not $value ){} if ( !$value ){}
uvidíte !
používá více lidí, tím, že pocházejí z jiné jazyky, jako je C#. Raději to píšu, protože je pro mě těžké vidět, když se rychle dívám na mé skripty.
– a
výrazy můžete kombinovat s operátorem-and
. Když to uděláte, musí být obě strany $true
pro celý výraz $true
.,
if ( ($age -gt 13) -and ($age -lt 55) )
V tomto příkladu $age
musí být 13 nebo starší na levé straně a méně než 55 na pravé straně. Přidal jsem další závorky, aby bylo v tomto příkladu jasnější, ale jsou volitelné, pokud je Expres jednoduchý. Zde je stejný příklad bez nich.
if ( $age -gt 13 -and $age -lt 55 )
hodnocení se děje zleva doprava. Pokud první položka vyhodnotí $false
, ukončí se brzy a neprovede správné srovnání., To je užitečné, když se musíte ujistit, že hodnota existuje před použitím. Test-Path
například způsobí chybu, pokud jí dáte $null
cesta.
if ( $null -ne $path -and (Test-Path -Path $path) )
-or
umožňuje vám určit dva výrazy a vrací $true
pokud jeden z nich je $true
.
if ( $age -le 13 -or $age -ge 55 )
Stejně jako -and
provozovatel, hodnocení se stane, zleva doprava., Kromě toho, že pokud je první část $true
, pak je celé Prohlášení $true
a nezpracovává zbytek výrazu.
také poznamenejte, jak funguje syntaxe pro tyto operátory. Potřebujete dva samostatné výrazy. Viděl jsem, jak se uživatelé snaží udělat něco takového $value -eq 5 -or 6
, aniž by si uvědomili svou chybu.
– XOR exclusive nebo
tento je trochu neobvyklý. -xor
umožňuje vyhodnotit pouze jeden výraz na $true
., Takže pokud jsou obě položky $false
nebo jsou obě položky $true
, pak je celý výraz $false
. Dalším způsobem, jak se na to podívat, je výraz pouze $true
, když jsou výsledky výrazu odlišné.
je vzácné, že by někdo někdy použil tohoto logického operátora a nemohu vymyslet dobrý příklad, proč bych ho někdy použil.
bitové operátory
bitové operátory provádějí výpočty bitů v hodnotách a v důsledku toho vytvářejí novou hodnotu., Výuka bitwise operátorů je nad rámec tohoto článku, ale zde je seznam je.
-
-band
binární -
-bor
binární -
-bxor
binární exkluzivní NEBO -
-bnot
binární -
-shl
posun vlevo -
-shr
shift
PowerShell výrazy
můžeme použít normální PowerShell uvnitř podmínky prohlášení.,
if ( Test-Path -Path $Path )
Test-Path
výnosy $true
nebo $false
, když se to provede. To platí také pro příkazy, které vracejí jiné hodnoty.
if ( Get-Process Notepad* )
To se bude rovnat $true
pokud je vrácena proces a $false
pokud není nic., Je to naprosto v pořádku používat potrubí výrazy nebo jiné PowerShell příkazy, jako je tento:
if ( Get-Process | Where Name -eq Notepad )
Tyto výrazy mohou být navzájem kombinovány s -and
-or
operátorů, ale budete muset použít závorky, aby se rozbít je do dílčích výrazů.
if ( (Get-Process) -and (Get-Service) )
Kontrola za $null
Mít žádný výsledek, nebo $null
hodnoty vyhodnocuje, aby $false
if
prohlášení., Při kontrole specificky $null
je nejlepší umístit $null
na levou stranu.
if ( $null -eq $value )
Existuje několik nuance při jednání s $null
hodnoty v prostředí PowerShell. Pokud máte zájem o potápění hlouběji, mám článek o všem, co jste chtěli vědět o $ null.
přiřazení proměnných
téměř jsem zapomněl přidat tento, dokud mi to Prasoon Karunan v nepřipomínal.,
normálně při přiřazení hodnoty proměnné se hodnota nepřechází na potrubí nebo konzolu. Když provedete přiřazení proměnné v dílčím výrazu, předá se do potrubí.
PS> $first = 1 PS> ($second = 2) 2
Podívejte se, jak $first
úkol nemá žádný výstup a $second
úkol? Když je přiřazení provedeno v příkazu if
, provede se stejně jako přiřazení $second
výše., Zde je čistý příklad o tom, jak byste mohli použít:
if ( $process = Get-Process Notepad* ) { $process | Stop-Process }
Pokud $process
dostane přiřazena hodnota, pak prohlášení bude $true
$process
dostane zastavil.
ujistěte se, že si to nezaměňujete s -eq
, protože to není kontrola rovnosti. To je více obskurní funkce, že většina lidí si neuvědomují funguje tímto způsobem.,
Alternativní cestu spuštění
if
prohlášení umožňuje určit akci pro nejen při prohlášení je $true
, ale také pro to, když je $false
. To je místo, kde else
prohlášení přichází do hry.
else
příkazelse
je vždy poslední částí příkazu if
při použití.
v tomto příkladu zkontrolujeme $path
, abychom se ujistili, že se jedná o soubor. Pokud najdeme soubor, přesuneme ho. Pokud ne, napíšeme varování., Tento typ větvení logiky je velmi časté.
Vnořený
if
else
prohlášení se blok skriptu, takže můžeme umístit jakýkoliv příkaz prostředí PowerShell uvnitř nich, včetně další if
prohlášení. To vám umožní využít mnohem složitější logiku.
v tomto příkladu nejprve otestujeme šťastnou cestu a poté na ni podnikneme kroky. Pokud se to nepodaří, provedeme další kontrolu a poskytneme uživateli podrobnější informace.
elsif
nejsme omezeni pouze na jednu podmíněnou kontrolu., Můžeme řetěz if
a else
příkazy společně namísto jejich vnoření pomocí příkazu elseif
.
provedení se děje shora dolů. Nejprve se vyhodnotí horníif
. Pokud je $false
, pak se přesune dolů na další elseif
nebo else
v seznamu. Posledníelse
je výchozí akce, která se má provést, pokud žádný z ostatních nevrátí $true
.,
switch
v bodě tis musím zmínitswitch
. Poskytuje alternativní syntaxi pro provádění více srovnání s hodnotou. S switch
zadáte výraz a tento výsledek se porovnává s několika různými hodnotami. Pokud je jedna z těchto hodnot mach, provede se odpovídající blok kódu. Podívejte se na tento příklad:
$itemType = 'Role' switch ( $itemType ) { 'Component' { 'is a component' } 'Role' { 'is a role' } 'Location' { 'is a location' } }
Existují tři možné hodnoty, které může odpovídat $itemType
., V tomto případě se bude shodovat sRole
ais a role
bude proveden. Použil jsem velmi jednoduchý příklad, abych vám dal nějakou expozici operátoroviswitch
. Mluvím více o všem, co jste kdy chtěli vědět o prohlášení switch v jiném článku.
potrubí
potrubí je velmi jedinečnou a důležitou vlastností PowerShell. Každá hodnota, která není potlačena nebo přiřazena proměnné, se umístí do potrubí., if
nám poskytuje způsob, jak využít potrubí způsobem, který není vždy zřejmý.
$discount = if ( $age -ge 55 ) { Get-SeniorDiscount } elseif ( $age -le 13 ) { Get-ChildDiscount } else { 0.00 }
každý blok skriptů umístí výsledky příkazy nebo hodnotu do potrubí. Výsledek příkazu if pak přiřazujeme proměnné $discount
. Tento příklad mohl stejně snadno přiřadit tyto hodnoty proměnné $discount
přímo v každém scriptblocku., Nemohu říci, že to používám s prohlášením if
velmi často, ale mám příklad, kde jsem to nedávno použil.
pole inline
mám funkci nazvanou Invoke-SnowSql, která spouští spustitelný soubor s několika argumenty příkazového řádku. Zde je klip z této funkce, kde sestavuji řadu argumentů.
$Debug
a$Path
proměnné jsou parametry funkce poskytované koncovým uživatelem. Hodnotím je inline uvnitř inicializace mého pole., Pokud je$Debug
pravda, pak tyto hodnoty spadají do$snowSqlParam
na správném místě. Totéž platí pro proměnnou $Path
.
Zjednodušte složité operace
je nevyhnutelné, že narazíte na situaci, která má příliš mnoho srovnání ke kontrole a vaše prohlášení if se posouvá z pravé strany obrazovky.
mohou být těžko čitelné a díky tomu jste náchylnější k chybám. S tím můžeme udělat pár věcí.,
pokračování řádku
tam někteří operátoři v PowerShell, které vám umožní zabalit příkaz k dalšímu řádku. Logické operátory -and
-or
jsou dobré hospodářské subjekty použít, pokud chcete zlomit svůj výraz do více řádků.
stále se tam děje hodně, ale umístění každého kusu na vlastní linii je velký rozdíl. Obvykle to dělám pouze tehdy, když dostanu více než dvě srovnání, nebo pokud musím posunout doprava a přečíst si některou z ligic.,
výsledky předběžného výpočtu
můžeme toto prohlášení vyjmout z příkazu if a zkontrolovat pouze výsledek.
to se cítí mnohem čistší než předchozí příklad. Máte také příležitost použít název proměnné, který vysvětluje, co to je, že opravdu kontrolujete. To je také příklad self dokumentující kód, který šetří zbytečné komentáře.
Vícenásobné if příkazy
můžeme to rozdělit na více příkazů a zkontrolovat je jeden po druhém. V tomto případě použijeme příznak nebo sledovací proměnnou ke kombinaci výsledků.,
musel jsem převrátit logiku, aby logika vlajky fungovala správně. Každé hodnocení je individuálníif
prohlášení. Výhodou je, že když ladíte, můžete přesně říct, co dělá logika. Byl jsem schopen přidat mnohem lepší výmluvnost ve stejnou dobu.
zjevnou nevýhodou je, že je mnohem více kódu k zápisu. Kód je složitější podívat se na to, jak to trvá jeden řádek logiky a exploduje do 25 nebo více řádků.
pomocí funkcí
můžeme také přesunout veškerou validační logiku do funkce., Podívejte se, jak čisté to vypadá na první pohled.
if ( Test-SecureDriveConfiguration -ADUser $user ) { # do something }
stále musíte vytvořit funkci pro ověření, ale tento kód je mnohem snazší pracovat. To usnadňuje testování tohoto kódu. Ve svých testech můžete vysmívat volání na Test-ADDriveConfiguration
a pro tuto funkci Potřebujete pouze dva testy. Jeden, kde se vrací $true
a ten, kde se vrací $false
. Testování další funkce bude jednodušší, protože je tak malé.,
tělo této funkce by mohlo být stále tou jednou vložkou, se kterou jsme začali, nebo rozloženou logikou, kterou jsme použili v poslední části. To funguje dobře pro oba scénáře a umožňuje vám tuto implementaci později snadno změnit.
zpracování chyb
jedním opravdu důležitým použitím příkazu if
je zkontrolovat chybové podmínky, než narazíte na chyby. Dobrým příkladem je zkontrolovat, zda složka již existuje, než ji zkusíte vytvořit.,
if ( -not (Test-Path -Path $folder) ) { New-Item -Type Directory -Path $folder }
rád bych řekl, že pokud očekáváte výjimku, pak to není opravdu výjimka. Zkontrolujte tedy své hodnoty a ověřte své podmínky, kde můžete.
Pokud se chcete ponořit trochu více do skutečného zacházení s výjimkami, mám článek o všem, co jste kdy chtěli vědět o výjimkách.
Poslední slova
if
prohlášení je takové jednoduché prohlášení, ale je velmi zásadní kus PowerShell. Najdete sami pomocí tohoto vícekrát téměř v každém skriptu píšete., Doufám, že máte lepší pochopení, než jste měli předtím.