Powershell: Vše, co jste chtěli vědět o if

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
  • 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, provede scriptblock 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říkazif právě hodnotil proměnnou $condition. Bylo to $true a provedlo by příkaz Write-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

    • -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>

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í -nese 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.

Share

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *