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

  • 05/23/2020
  • 18 minut, aby si
    • j
    • x
    • t
    • D

stejně Jako mnoho jiných jazyků, PowerShell má prohlášení pro podmíněně spuštění kódu v yourscripts. Jedním z těchto tvrzení je prohlášení If., Dnes se ponoříme do jednoho z nichnejzákladnější příkazy v PowerShell.

Poznámka:

původní verze tohoto článku vyšla na blogu napsal @KevinMarquette. Tým ThePowerShell děkuje Kevinovi za sdílení tohoto obsahu s námi. Prosím, podívejte se na jeho blog atPowerShellExplained.com.

Podmíněné provedení

skripty často nutné učinit rozhodnutí a provádět 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 k vyhodnocení, pakrozhodněte jinou část kódu na základě tohoto hodnocení. To je přesně to, co dělá prohlášení if.

if

Zde je základní příklad if prohlášení:

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

první věc, if prohlášení se je vyhodnotit výraz v závorkách. Pokud vyhodnotí $true, provede scriptblock v závorkách., Pokud byla hodnota $false, pak by to přeskočilo 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ří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 getsexecuted. V PowerShellu tomu tak není. Musíte poskytnout plnou scriptblock s rovnátky forit pracovat správně.,

srovnávací operátory

nejčastější použití příkazu if pro porovnává dvě položky mezi sebou. PowerShell mázvláštní operátoři pro různé srovnávací scénáře. Při použití srovnávacího operátora je hodnotana levé straně je porovnána 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-MysteryValueif ( 5 -eq $value ){ # do something}

V tomto příkladu, mám známé hodnoty 5 porovnání $value jestli theymatch.

jedním z možných případů 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.

v jiných jazycích, jako je C#, je běžné používat == pro rovnost (např.: 5 == $value), ale to nefunguje 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. Tím, že umístíte svou známou hodnotu na druhou stranu, dělá tuto chybu nepříjemnější.

tento operátor (a další) má několik variant.,

  • -eq případ-necitlivý rovnosti
  • -ieq případ-necitlivý rovnosti
  • -ceq případ-citlivé rovnosti

-ne není rovno

Mnozí operátoři související subjekt, který je běžný pro opačný výsledek. -ne ověřuje, že hodnoty se navzájem nerovná.

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

Použít, aby se ujistil, že akce se provede pouze v případě, že hodnota není 5., Dobré použití-případy, kdyby bylo zkontrolovat, zda byla služba v provozním stavu, než se ji pokusíte spustit.

Varianty:

  • -ne velká a malá písmena nejsou stejná
  • -ine velká a malá písmena nejsou stejná
  • -cne případ-citlivé není rovno

jedná se o 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, velká a malá písmena

  • -cge větší než nebo rovno, velká a malá písmena
  • -lt méně než
  • -ilt méně než, velká a malá písmena
  • -clt menší než, velká a malá písmena
  • -le menší než nebo rovno
  • -ile menší než nebo rovno, velká a malá písmena
  • -cle méně než nebo se rovná, velká a malá písmena
  • nevím, proč by případ použití-citlivé a necitlivé možnosti pro tyto subjekty.,

    -podobně jako zástupné zápasy

    PowerShell má svou vlastní syntaxi odpovídající zástupným vzorům a můžete ji použít s operátorem-like. Tyto zástupné vzory jsou poměrně základní.

    • ? jeden libovolný znak
    • * odpovídá 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 shodovatněco ve středu řetězce, musíte umístit * na oba konce řetězce.,e“>

    Varianty:

    • -like případ-necitlivý zástupný znak
    • -ilike případ-necitlivý zástupný znak
    • -clike případ-citlivé zástupný znak
    • -notlike případ-necitlivý zástupné není uzavřeno
    • -inotlike případ-necitlivý zástupné není uzavřeno
    • -cnotlike případ-citlivé zástupné není uzavřeno

    -match regulárním výrazem

    -match provozovatel umožňuje zkontrolovat řetězec pro regular-expression-based zápas., Použijte thiswhen 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}

    vzor regexu odpovídá ve výchozím nastavení kdekoli v řetězci. Takže můžete zadat podřetězec, kterýchcete odpovídat takto:

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

    Regex je komplexní jazyk sám o sobě a stojí za to se podívat do. Mluvím více o -match a mnoho způsobů, jak používat regex 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 can check a value’s type with the -is operator.,

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

    můžete použít, pokud pracujete s třídami nebo přijímáte různé objekty přes potrubí. Youcould mít buď službu nebo název služby jako vstup. Poté zkontrolujte, zda máte službua načíst 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. To je při práci se sbírkou trochu jinak. Každá položka ve sbírce získáváhodnocení a operátor vrátí každou hodnotu, která se vyhodnotí na $true.,

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

    To stále funguje správně v if prohlášení. Takže hodnota je vrácena operátorem, pakcelé prohlášení je $true.

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

    v detailech se skrývá jedna malá past, na kterou musím poukázat. Při použití-neoperátora tímto způsobem je snadné se mylně podívat na logiku dozadu. Použití -ne s acollection returns $true pokud některá položka ve sbírce neodpovídá vaší hodnotě.,

    PS> 1,2,3 -ne 4123

    To může vypadat jako chytrý trik, ale máme operátory -contains -in že zvládnout to účinněji. A -notcontains dělá to, co očekáváte.

    -obsahuje

    -contains operátor kontroluje sběr vaší hodnoty. Jakmile najde shodu, vrátí $true.

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

    toto je preferovaný způsob, jak zjistit, zda kolekce obsahuje vaši hodnotu., Použití Where-Object (nebo-eq) prochází celý seznam pokaždé a je výrazně pomalejší.,

    Varianty:

    • -contains případ-necitlivý zápas
    • -icontains případ-necitlivý zápas
    • -ccontains case-sensitive match
    • -notcontains velká a malá písmena není uzavřeno
    • -inotcontains velká a malá písmena není uzavřeno
    • -cnotcontains případ-citlivé není uzavřeno

    -v

    -in operátor je jako -contains provozovatel kromě kolekce je na pravé straně.,

    $array = 1..6if ( 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-Pathje $false.

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

    Většina provozovatelů mluvili jsme o tom mám variantu, kde není třeba používat -notoperátor. Ale stále jsou chvíle, kdy je to užitečné.

    !, provozovatel

    můžete použít ! jako alias pro -not.

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

    můžete vidět ! používá více lidí, kteří pocházejí z jiných jazyků, jako je C#. Raději píšu itout, 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 musí být $age 13 nebo starší pro levou stranu a méně než 55 pro pravou stranu. V tomto příkladu jsem přidal další závorky, aby to bylo jasnější, ale jsou volitelné, pokud je exprese 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 dřívepoužíváte ji., Například Test-Path vyvolá 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 exprese.

    také poznamenejte, jak funguje syntaxe pro tyto operátory. Potřebujete dva samostatné výrazy. Ihave viděli uživatelé se 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 bothitemy $false nebo jsou obě položky $true, pak je celý výraz $false. Dalším způsobem, jak se na to dí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 jako towhy, který bych kdy použil.

    bitové operátory

    bitové operátory provádějí výpočty bitů v hodnotách a vytvářejí novou hodnotu jako theresult., Výuka bitových operátorů je nad rámec tohoto článku,ale zde je seznam thethem.

    • -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é se vrátíjiné hodnoty.

    if ( Get-Process Notepad* )

    vyhodnocuje se na $true pokud existuje vrácený proces a $false pokud není nic., To’sperfectly platné k použití 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 pravděpodobně používat závorky, aby je proniknout do seskupení.

    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 kontroláchspecificky pro $null je vhodné umístit $null na levou stranu.

    if ( $null -eq $value )

    při práci s hodnotami $null v PowerShell existuje poměrně málo nuancí. Pokud vás zajímá 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.,

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

    normálně při přiřazení hodnoty proměnné se hodnota nepřechází na potrubí orconsole. Když provedete přiřazení proměnné v dílčím výrazu, předá se to thepipeline.

    PS> $first = 1PS> ($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 cleanexample 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í je $true $process dostane zastavil.

    ujistěte se, že si to nezaměňujete s -eq, protože to není kontrola rovnosti. To je moreobscure 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 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 insidethem, 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ří, provedemedalší kontrola a poskytnutí podrobnějších informací uživateli.

    elsif

    nejsme omezeni pouze na jednu podmíněnou kontrolu., Můžeme řetěz if a else prohlášeníspolečně namísto vnoření pomocí příkazu .

    provedení se děje shora dolů. Nejprve se vyhodnotí horníif. Pokud se to $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 tomto bodě musím zmínitswitch. Poskytuje alternativní syntaxi pro provedenívíce srovnání s hodnotou. switch, zadáte výraz a výsledek getscompared s několika různými hodnotami. Pokud se jedna z těchto hodnot shoduje, je blok odpovídajícího kódu proveden. 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 shoduje s Role., Použil jsem jednoduchý příklad, abych vám dal nějakou expozici operátoroviswitch. Mluvím víco všem, co jste kdy chtěli vědět o prohlášení switch v jiném článku.

    potrubí

    potrubí je jedinečnou a důležitou vlastností PowerShell. Každá hodnota, která není potlačenanebo přiřazena proměnné dostane umístěn v potrubí. if nám poskytuje způsob, jak využít ropovodu 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í. Poté přiřadíme výsledek příkazu if do proměnné $discount. Tento příklad by mohl mít stejně snadnépřidělte tyto hodnoty do proměnné $discount přímo v každém scriptblocku. Nemůžu říct, že Můžu s if prohlášení často, ale mám příklad, kdy jsem použil tento nedávno.,

    pole inline

    mám funkci nazvanou Invoke-SnowSql, která spouští spustitelný soubor s několika příkazovými řádky. 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šit složité operace

    je To nevyhnutelné, že se dostanete do situace, že má příliš mnoho srovnání kontrolovat a svůjIf prohlášení svitky z pravé straně 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., Na logicaloperators -and -or jsou dobré hospodářské subjekty použít, pokud chcete zlomit svůj výraz intomultiple linky.

    stále se toho hodně děje, ale umístění každého kusu na vlastní linii je velký rozdíl.Já obecně používají, když jsem si více než dvě srovnání, nebo jestli budu muset posunout doprava abyčtěte jakékoliv logiky.

    Pre-výpočtu výsledků

    můžeme vzít, že prohlášení z if prohlášení a pouze zkontrolovat výsledek.

    to se cítí mnohem čistší než předchozí příklad., Máte také možnost použít avariable jméno, které vysvětluje, co to je, že jste opravdu kontrolu. To je také příklad samodokumentujícího kódu, který ukládá zbytečné komentáře.

    Multiple 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žíváme aflag nebo sledovací proměnnou ke kombinaci výsledků.

    musel jsem převrátit logiku, aby logika vlajky fungovala správně. Každé hodnocení je anindividuálníif prohlášení., Výhodou je, že když ladíte, můžete telexactly co logika dělá. 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ší, aby se podívaljako 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 aglance.,

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

    Budete ještě muset vytvořit funkci dělat validaci, ale to dělá tento kód mnohem jednodušší pracovat. To usnadňuje testování tohoto kódu. Ve svých testech můžete vysmívat volání naTest-ADDriveConfiguration a pro tuto funkci Potřebujete pouze dva testy. Jeden, kde se vrací$true a ten, kde se vrací $false. Testování druhé funkce je jednodušší, protože jetak malé.

    tělo, že funkce by mohla být stále, že jednu vložku jsme začali s nebo rozložený logiky jsme použili v poslední části., To funguje dobře pro oba scénáře a umožňuje vám to snadno změnitplementace později.

    zpracování chyb

    jedním důležitým použitím příkazu if je kontrola chybových podmínek před spuštěnímchyby. Dobrým příkladem je zkontrolovat, zda složka již existuje, než se ji pokusí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, není to opravdu výjimka. Takže zkontrolujte 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.

    závěrečná slova

    if prohlášení je tak jednoduché prohlášení, ale je základním kusem PowerShell. Budete to používat vícekrát v téměř každém skriptu, který píšete. Doufám, že máte lepší pochopení, než jste měli předtím.

    Napsat komentář

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