- 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ísmenaneví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í-ne
operá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-Path
je $false
.
if ( -not ( Test-Path -Path $path ) )
Většina provozovatelů mluvili jsme o tom mám variantu, kde není třeba používat -not
operá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.