Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Alles wat u wilde weten over de
Net als in veel andere talen bevat PowerShell instructies voor het voorwaardelijk uitvoeren van code in uw scripts. Een van deze uitspraken is de If-instructie. Vandaag gaan we dieper in op een van de meest fundamentele opdrachten in PowerShell.
Notitie
De oorspronkelijke versie van dit artikel verscheen op de blog geschreven door @KevinMarquette. Het PowerShell-team bedankt Kevin voor het delen van deze inhoud met ons. Bekijk zijn blog op PowerShellExplained.com.
Voorwaardelijke uitvoering
Uw scripts moeten vaak beslissingen nemen en verschillende logica uitvoeren op basis van deze beslissingen.
Dit bedoel ik met voorwaardelijke uitvoering. U hebt één instructie of waarde die u wilt evalueren en voert vervolgens een ander codegedeelte uit op basis van die evaluatie. Dit is precies wat de if
verklaring doet.
De if
-instructie
Hier volgt een eenvoudig voorbeeld van de if
-instructie:
$condition = $true
if ( $condition )
{
Write-Output "The condition was true"
}
Het eerste wat de if
instructie doet, is de uitdrukking tussen haakjes evalueren. Als het gelijk is aan $true
, dan wordt de scriptblock
in de accolades uitgevoerd. Als de waarde is $false
, wordt dat scriptblok overgeslagen.
In het vorige voorbeeld evalueerde de if
-instructie uitsluitend de variabele $condition
. Het was $true
en zou de Write-Output
opdracht in het scriptblok hebben uitgevoerd.
In sommige talen kunt u één regel code plaatsen na de if
instructie en deze wordt uitgevoerd. Dat is niet het geval in PowerShell. U moet een volledige scriptblock
met accolades opgeven om het correct te laten functioneren.
Vergelijkingsoperatoren
Het meest voorkomende gebruik van de if
-instructie is het vergelijken van twee items met elkaar. PowerShell heeft speciale operators voor verschillende vergelijkingsscenario's. Wanneer u een vergelijkingsoperator gebruikt, wordt de waarde aan de linkerkant vergeleken met de waarde aan de rechterkant.
-eq voor gelijkheid
De -eq
voert een gelijkheidscontrole uit tussen twee waarden om ervoor te zorgen dat ze gelijk zijn aan elkaar.
$value = Get-MysteryValue
if ( 5 -eq $value )
{
# do something
}
In dit voorbeeld neem ik een bekende waarde van 5
en vergelijk ik deze met mijn $value
om te zien of ze overeenkomen.
Een mogelijke use-case is om de status van een waarde te controleren voordat u er een actie op uitvoert. U kunt een service verkrijgen en controleren of de status actief is voordat u Restart-Service
aanriep.
Het is gebruikelijk in andere talen zoals C# om ==
te gebruiken voor gelijkheid (bijvoorbeeld 5 == $value
) maar dat werkt niet met PowerShell. Een andere veelvoorkomende fout die mensen maken, is het gebruik van het gelijkteken (bijvoorbeeld 5 = $value
) dat is gereserveerd voor het toewijzen van waarden aan variabelen. Door uw bekende waarde aan de linkerkant te plaatsen, maakt het die fout onhandiger om te maken.
Deze operator (en andere) heeft enkele variaties.
-
-eq
hoofdletterongevoelige gelijkheid -
-ieq
hoofdletterongevoelige gelijkheid -
-ceq
hoofdlettergevoelige gelijkheid
-ne niet gelijk aan
Veel operators hebben een gerelateerde operator die controleert op het tegenovergestelde resultaat.
-ne
controleert of de waarden niet aan elkaar gelijk zijn.
if ( 5 -ne $value )
{
# do something
}
Gebruik dit om ervoor te zorgen dat de actie alleen wordt uitgevoerd als de waarde niet 5
is. Een goed gebruiksvoorbeeld waarbij moet worden gecontroleerd of een service de status Actief heeft voordat u deze probeert te starten.
Variaties:
-
-ne
niet gelijk aan, niet hoofdlettergevoelig -
-ine
niet gelijk aan niet hoofdlettergevoelig -
-cne
hoofdlettergevoelig niet gelijk aan
Dit zijn inverse variaties van -eq
. Ik groepeer deze typen wanneer ik variaties voor andere operators vermeld.
-gt -ge -lt -le voor groter dan of kleiner dan
Deze operators worden gebruikt bij het controleren of een waarde groter of kleiner is dan een andere waarde.
De -gt -ge -lt -le
staat voor GreaterThan, GreaterThanOrEqual, LessThan en LessThanOrEqual.
if ( $value -gt 5 )
{
# do something
}
variaties:
-
-gt
groter dan -
-igt
groter dan niet-hoofdlettergevoelig -
-cgt
groter dan, hoofdlettergevoelig -
-ge
groter dan of gelijk aan -
-ige
groter dan of gelijk, niet hoofdlettergevoelig -
-cge
groter dan of gelijk aan, hoofdlettergevoelig -
-lt
kleiner dan -
-ilt
minder dan niet-hoofdlettergevoelig -
-clt
kleiner dan en hoofdlettergevoelig -
-le
kleiner dan of gelijk aan -
-ile
kleiner dan of gelijk, niet hoofdlettergevoelig -
-cle
kleiner dan of gelijk aan, hoofdlettergevoelig
Ik weet niet waarom u hoofdlettergevoelige en niet-gevoelige opties voor deze operators zou gebruiken.
overeenkomsten met jokertekens
PowerShell heeft zijn eigen syntaxis voor patroonmatching met jokertekens en u kunt deze syntaxis gebruiken met de operator -like
. Deze jokertekenpatronen zijn redelijk eenvoudig.
-
?
komt overeen met een willekeurig teken -
*
komt overeen met een willekeurig aantal tekens
$value = 'S-ATX-SQL01'
if ( $value -like 'S-*-SQL??')
{
# do something
}
Het is belangrijk om aan te geven dat het patroon overeenkomt met de hele tekenreeks. Als u iets in het midden van de tekenreeks wilt vergelijken, moet u de *
aan beide uiteinden van de tekenreeks plaatsen.
$value = 'S-ATX-SQL02'
if ( $value -like '*SQL*')
{
# do something
}
Varianten:
-
-like
niet hoofdlettergevoelig jokerteken -
-ilike
niet hoofdlettergevoelig jokerteken -
-clike
hoofdlettergevoelig jokerteken -
-notlike
komt niet overeen met de niet-hoofdlettergevoelige wildcard -
-inotlike
hoofdletterongevoelig jokerteken komt niet overeen -
-cnotlike
hoofdlettergevoelig wildcard komt niet overeen
-match reguliere expressie
Met de operator -match
kunt u een tekenreeks controleren op een overeenkomst op basis van reguliere expressies. Gebruik deze optie wanneer de jokertekenpatronen niet flexibel genoeg voor u zijn.
$value = 'S-ATX-SQL01'
if ( $value -match 'S-\w\w\w-SQL\d\d')
{
# do something
}
Een regex-patroon vindt standaard overal in de tekenreeks overeenkomsten. U kunt dus een subtekenreeks opgeven die u als volgt wilt laten overeenkomen:
$value = 'S-ATX-SQL01'
if ( $value -match 'SQL')
{
# do something
}
Regex is een complexe taal op zichzelf en de moeite waard om te bestuderen. Ik praat meer over -match
en de vele manieren om regex- in een ander artikel te gebruiken.
variaties:
-
-match
hoofdlettergevoelige regex -
-imatch
hoofdlettergevoelige regex -
-cmatch
hoofdlettergevoelige regex -
-notmatch
regex die niet-hoofdlettergevoelig is komt niet overeen -
-inotmatch
case-insensitive regex geen match gevonden -
-cnotmatch
hoofdlettergevoelige regex komt niet overeen
-is van het type
U kunt het type van een waarde controleren met de operator -is
.
if ( $value -is [string] )
{
# do something
}
U kunt dit gebruiken als u met klassen werkt of verschillende objecten via de pijplijn accepteert. U kunt een service of een servicenaam als invoer hebben. Controleer vervolgens of je een service hebt en haal de service op als je alleen de naam hebt.
if ( $Service -isnot [System.ServiceProcess.ServiceController] )
{
$Service = Get-Service -Name $Service
}
Variaties:
-
-is
van type -
-isnot
niet van dit type
Operatoren voor verzameling
Wanneer u de vorige operatoren met één waarde gebruikt, wordt het resultaat $true
of $false
. Dit wordt iets anders afgehandeld wanneer u met een verzameling werkt. Elk item in de verzameling wordt geëvalueerd en de operator retourneert elke waarde die resulteert in $true
.
PS> 1,2,3,4 -eq 3
3
Dit werkt nog steeds correct in een if
verklaring. Er wordt dus een waarde geretourneerd door uw operator en de hele instructie wordt $true
.
$array = 1..6
if ( $array -gt 3 )
{
# do something
}
Er is een kleine valkuil verborgen in de details die ik hier moet aanwijzen. Wanneer u de -ne
-operator op deze manier gebruikt, kunt u de logica gemakkelijk verkeerd begrijpen. Als u -ne
gebruikt met een verzameling, wordt $true
geretourneerd als een item in de verzameling niet overeenkomt met uw waarde.
PS> 1,2,3 -ne 4
1
2
3
Dit kan lijken op een slimme truc, maar we hebben operators -contains
en -in
die dit efficiënter verwerken. En -notcontains
doet wat je verwacht.
-bevat
Operator -contains
controleert de verzameling op de door u opgegeven waarde. Zodra er een overeenkomst wordt gevonden, wordt $true
geretourneerd.
$array = 1..6
if ( $array -contains 3 )
{
# do something
}
Dit is de voorkeurswijze om te zien of een verzameling uw waarde bevat. Het gebruik van Where-Object
(of -eq
) doorloopt de hele lijst elke keer, waardoor het aanzienlijk langzamer is.
Variaties:
-
-contains
hoofdletterongevoelige overeenkomst -
-icontains
hoofdletterongevoelige overeenkomst -
-ccontains
hoofdlettergevoelige overeenkomst -
-notcontains
komt niet overeen, ongeacht hoofdlettergebruik -
-inotcontains
komt niet overeen en is niet hoofdlettergevoelig -
-cnotcontains
hoofdlettergevoelig niet overeenkomen
-in
De operator -in
is net als de operator -contains
, behalve dat de verzameling aan de rechterkant staat.
$array = 1..6
if ( 3 -in $array )
{
# do something
}
Variaties:
-
-in
hoofdletterongevoelige overeenkomst -
-iin
hoofdletterongevoelige overeenkomst -
-cin
hoofdlettergevoelige overeenkomst -
-notin
niet hoofdlettergevoelig en komt niet overeen -
-inotin
niet hoofdlettergevoelig en niet overeenkomend -
-cnotin
hoofdlettergevoelig komt niet overeen
Logische operatoren
Logische operators worden gebruikt om andere expressies om te keren of te combineren.
-niet
Met de operator -not
wordt een expressie omgekeerd van $false
naar $true
of van $true
naar $false
. Hier volgt een voorbeeld waarin we een actie willen uitvoeren wanneer Test-Path
is $false
.
if ( -not ( Test-Path -Path $path ) )
De meeste operators die we hebben besproken, hebben een variatie waarbij u de operator -not
niet hoeft te gebruiken. Maar er zijn nog steeds momenten dat het nuttig is.
! bediener
U kunt !
gebruiken als alias voor -not
.
if ( -not $value ){}
if ( !$value ){}
Mogelijk ziet u !
meer gebruikt door personen die afkomstig zijn uit een andere taal, zoals C#. Ik typ het liever omdat ik het moeilijk vind om te zien wanneer ik mijn scripts snel bekijk.
-en
U kunt expressies combineren met de operator -and
. Als u dat doet, moeten beide zijden $true
zijn zodat de gehele uitdrukking $true
is.
if ( ($age -gt 13) -and ($age -lt 55) )
In dat voorbeeld moet $age
13 of ouder zijn voor de linkerkant en kleiner dan 55 voor de rechterkant. Ik heb extra haakjes toegevoegd om het in dat voorbeeld duidelijker te maken, maar ze zijn optioneel zolang de expressie eenvoudig is. Hier volgt hetzelfde voorbeeld zonder deze.
if ( $age -gt 13 -and $age -lt 55 )
Evaluatie vindt plaats van links naar rechts. Als het eerste item evalueert tot $false
, wordt het voortijdig beëindigd en wordt de juiste vergelijking niet uitgevoerd. Dit is handig wanneer u ervoor moet zorgen dat er een waarde bestaat voordat u deze gebruikt.
Test-Path
genereert bijvoorbeeld een fout als u deze een $null
pad geeft.
if ( $null -ne $path -and (Test-Path -Path $path) )
-of
Met de -or
kunt u twee expressies opgeven en $true
retourneren als een van deze expressies is $true
.
if ( $age -le 13 -or $age -ge 55 )
Net als bij de operator -and
vindt de evaluatie plaats van links naar rechts. Behalve dat als het eerste deel $true
is, wordt de hele instructie $true
en wordt de rest van de expressie niet verwerkt.
Noteer ook hoe de syntaxis werkt voor deze operators. U hebt twee afzonderlijke expressies nodig. Ik heb gezien dat gebruikers iets als dit $value -eq 5 -or 6
proberen te doen zonder hun fout te realiseren.
-xor exclusief of
Deze is een beetje ongebruikelijk.
-xor
staat slechts één uitdrukking toe om te evalueren tot $true
. Dus als beide items zijn $false
of beide items $true
zijn, is de hele expressie $false
. Een andere manier om dit te bekijken, is dat de uitdrukking alleen $true
is wanneer de resultaten van de uitdrukking anders zijn.
Het is zeldzaam dat iemand deze logische operator ooit zou gebruiken en ik kan geen goed voorbeeld bedenken waarom ik het ooit zou gebruiken.
Bitsgewijze operatoren
Bitwise-operators voeren berekeningen uit op de bits binnen de waarden en produceren een nieuwe waarde als resultaat. Het onderwijzen van bitwise bewerkingen valt buiten de scope van dit artikel, maar hier is de lijst van bitwise bewerkingen.
-
-band
binair AND -
-bor
binair OR -
-bxor
binaire exclusieve OR -
-bnot
binair NIET -
-shl
naar links verplaatsen -
-shr
naar rechts verschuiven
PowerShell-expressies
We kunnen normale PowerShell in de voorwaardeverklaring gebruiken.
if ( Test-Path -Path $Path )
Test-Path
retourneert $true
of $false
wanneer deze wordt uitgevoerd. Dit geldt ook voor opdrachten die andere waarden retourneren.
if ( Get-Process Notepad* )
Het resulteert in $true
als er een geretourneerd proces is en in $false
als dat niet zo is. Het is perfect geldig om pijplijnexpressies of andere PowerShell-instructies als volgt te gebruiken:
if ( Get-Process | where Name -EQ Notepad )
Deze expressies kunnen met elkaar worden gecombineerd met de operatoren -and
en -or
, maar mogelijk moet u haakjes gebruiken om ze op te splitsen in subexpressies.
if ( (Get-Process) -and (Get-Service) )
Controleren op $null
Het hebben van geen resultaat of een $null
-waarde evalueert naar $false
in de if
-instructie. Wanneer u specifiek op $null
controleert, is het een best practice om de $null
aan de linkerkant te plaatsen.
if ( $null -eq $value )
Er zijn nogal wat nuances bij het omgaan met $null
waarden in PowerShell. Als je geïnteresseerd bent in dieper duiken, heb ik een artikel over alles wat je wilde weten over $null.
Variabele toewijzing binnen de voorwaarde
Ik ben deze bijna vergeten toe te voegen tot Prasoon Karunan V me eraan herinnerd.
if ($process=Get-Process notepad -ErrorAction Ignore) {$process} else {$false}
Normaal gesproken wordt de waarde niet doorgegeven aan de pijplijn of console wanneer u een waarde toewijst aan een variabele. Wanneer u een variabeletoewijzing uitvoert in een subexpressie, wordt deze doorgegeven aan de pijplijn.
PS> $first = 1
PS> ($second = 2)
2
Zie hoe de $first
opdracht geen uitvoer heeft terwijl de $second
opdracht dat wel heeft? Wanneer een opdracht wordt uitgevoerd in een if
-instructie, wordt deze net als de bovenstaande $second
-toewijzing uitgevoerd. Hier volgt een schoon voorbeeld van hoe u deze kunt gebruiken:
if ( $process = Get-Process Notepad* )
{
$process | Stop-Process
}
Als $process
een waarde krijgt toegewezen, wordt de instructie $true
en wordt $process
gestopt.
Zorg ervoor dat u dit niet verwar met -eq
omdat dit geen gelijkheidscontrole is. Dit is een onbekende functie die de meeste mensen niet beseffen dat op deze manier werkt.
Variabele toewijzing vanuit het scriptblok
U kunt ook het scriptblok voor de if
instructie gebruiken om een waarde toe te wijzen aan een variabele.
$discount = if ( $age -ge 55 )
{
Get-SeniorDiscount
}
elseif ( $age -le 13 )
{
Get-ChildDiscount
}
else
{
0.00
}
Elk scriptblok schrijft de resultaten van de opdrachten of de waarde als uitvoer. We kunnen het resultaat van de if
-instructie toewijzen aan de $discount
variabele. In dat voorbeeld kunnen deze waarden net zo eenvoudig rechtstreeks in elk scriptblok aan de $discount
variabele worden toegewezen. Ik kan niet zeggen dat ik dit vaak gebruik met de if
verklaring, maar ik heb wel een voorbeeld waarin ik dit onlangs heb gebruikt.
Alternatief uitvoeringspad
Met de instructie if
kunt u een actie opgeven voor niet alleen wanneer de instructie is $true
, maar ook voor wanneer deze is $false
. Hier komt de else
verklaring aan de bod.
anders
De else
-instructie is altijd het laatste deel van de if
instructie wanneer deze wordt gebruikt.
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."
}
In dit voorbeeld controleren we de $path
om te controleren of het een bestand is. Als we het bestand vinden, verplaatsen we het. Zo niet, dan schrijven we een waarschuwing. Dit type vertakkingslogica is heel gebruikelijk.
Genest als
De if
- en else
-instructies nemen een scriptblok, zodat we elke PowerShell-opdracht erin kunnen plaatsen, inclusief een andere if
-instructie. Hierdoor kunt u veel complexere logica gebruiken.
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."
}
}
In dit voorbeeld testen we eerst het gelukkige pad en nemen we vervolgens actie op. Als dat mislukt, voeren we nog een controle uit en geven we meer gedetailleerde informatie aan de gebruiker.
elseif
We zijn niet beperkt tot slechts één voorwaardelijke controle. We kunnen if
- en else
-instructies samenvoegen in plaats van ze te nesten met behulp van de elseif
-instructie.
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."
}
De uitvoering vindt plaats van boven naar beneden. De belangrijkste if
instructie wordt eerst geëvalueerd. Als dat $false
is, gaat deze omlaag naar de volgende elseif
of else
in de lijst. Die laatste else
is de standaardactie die moet worden uitgevoerd als geen van de andere acties $true
retourneert.
schakelaar
Op dit punt moet ik de switch
verklaring vermelden. Het biedt een alternatieve syntaxis voor het uitvoeren van meerdere vergelijkingen met een waarde. Met de switch
geeft u een expressie op en dat resultaat wordt vergeleken met verschillende waarden. Als een van deze waarden overeenkomt, wordt het overeenkomende codeblok uitgevoerd. Bekijk dit voorbeeld:
$itemType = 'Role'
switch ( $itemType )
{
'Component'
{
'is a component'
}
'Role'
{
'is a role'
}
'Location'
{
'is a location'
}
}
Er zijn drie mogelijke waarden die overeenkomen met de $itemType
. In dit geval komt het overeen met Role
. Ik heb een eenvoudig voorbeeld gebruikt om je kennis te laten maken met de switch
-operator. Ik vertel meer over alles wat je ooit wilde weten over de switch-statement in een ander artikel.
Array inline
Ik heb een functie met de naam Invoke-SnowSql waarmee een uitvoerbaar bestand met verschillende opdrachtregelargumenten wordt gestart. Hier volgt een clip van die functie waarin ik de matrix met argumenten maak.
$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
}
)
De variabelen $Debug
en $Path
zijn parameters voor de functie die door de eindgebruiker wordt geleverd.
Ik evalueer ze direct tijdens de initialisatie van mijn array. Als $Debug
waar is, vallen deze waarden op de juiste plaats in de $snowSqlParam
. Hetzelfde geldt voor de variabele $Path
.
Complexe bewerkingen vereenvoudigen
Het is onvermijdelijk dat u een situatie tegenkomt waarin er veel te veel vergelijkingen zijn om na te gaan en uw if
-instructie verdwijnt van de rechterkant van het scherm.
$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
}
Ze kunnen moeilijk te lezen zijn en waardoor u gevoeliger bent voor fouten. Er zijn een paar dingen die we daar aan kunnen doen.
Regelovername
Er zijn enkele operators in PowerShell waarmee u de opdracht naar de volgende regel kunt verpakken. De logische operators -and
en -or
zijn goede operators die u kunt gebruiken als u de expressie in meerdere regels wilt opsplitsen.
if ($null -ne $user -and
$user.Department -eq 'Finance' -and
$user.Title -match 'Senior' -and
$user.HomeDrive -notlike '\\server\*'
)
{
# Do Something
}
Er is nog steeds veel aan de hand, maar het plaatsen van elk stuk op een eigen lijn maakt een groot verschil. Ik gebruik dit over het algemeen als ik meer dan twee vergelijkingen krijg of als ik naar rechts moet schuiven om een van de logica te lezen.
Resultaten vooraf berekenen
We kunnen die instructie uit de if
instructie halen en alleen het resultaat controleren.
$needsSecureHomeDrive = $null -ne $user -and
$user.Department -eq 'Finance' -and
$user.Title -match 'Senior' -and
$user.HomeDrive -notlike '\\server\*'
if ( $needsSecureHomeDrive )
{
# Do Something
}
Dit voelt gewoon veel schoner aan dan in het vorige voorbeeld. U krijgt ook de mogelijkheid om een variabelenaam te gebruiken waarin wordt uitgelegd wat het is dat u echt controleert. Dit is ook en een voorbeeld van zelfdocumenterende code waarmee onnodige opmerkingen worden opgeslagen.
Meerdere if-statements
We kunnen dit opsplitsen in meerdere uitspraken en ze één voor één controleren. In dit geval gebruiken we een vlag of een trackingvariabele om de resultaten te combineren.
$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
}
Ik moest de logica omkeren om de vlaglogica correct te laten werken. Elke evaluatie is een afzonderlijke if
-verklaring. Het voordeel hiervan is dat wanneer u foutopsporing uitvoert, u precies kunt zien wat de logica doet. Ik kon tegelijkertijd een veel betere manier van woordrijkheid toevoegen.
Het voor de hand liggende nadeel is dat het zoveel meer code is om te schrijven. De code is gecompliceerder omdat een enkele logische regel wordt uitgewerkt tot 25 of meer regels.
Functies gebruiken
We kunnen ook al die validatielogica naar een functie verplaatsen. Kijk hoe schoon dit er in een oogopslag uitziet.
if ( Test-SecureDriveConfiguration -ADUser $user )
{
# do something
}
U moet nog steeds de functie maken om de validatie uit te voeren, maar deze code is veel gemakkelijker te gebruiken. Hierdoor is deze code eenvoudiger te testen. In uw tests kunt u de aanroep naar Test-ADDriveConfiguration
mocken en u hebt slechts twee tests voor deze functie nodig. Een waar het $true
retourneert en een waar het $false
retourneert. Het testen van de andere functie is eenvoudiger omdat deze zo klein is.
De hoofdtekst van die functie kan nog steeds die ene regel zijn waarmee we begonnen, of de uitgebreide logica die we in de laatste sectie hebben gebruikt. Dit werkt goed voor beide scenario's en stelt u in staat om deze implementatie later eenvoudig te wijzigen.
Foutafhandeling
Een belangrijk gebruik van de if
-instructie is om te controleren op foutcondities voordat u op fouten stuit. Een goed voorbeeld is om te controleren of er al een map bestaat voordat u deze probeert te maken.
if ( -not (Test-Path -Path $folder) )
{
New-Item -Type Directory -Path $folder
}
Ik wil zeggen dat als je verwacht dat er een uitzondering plaatsvindt, het niet echt een uitzondering is. Controleer dus uw waarden en valideer uw voorwaarden waar u kunt.
Als je wat meer wilt ingaan op de daadwerkelijke verwerking van uitzonderingen, heb ik een artikel over alles wat je ooit wilde weten over uitzonderingen.
Laatste woorden
De if
-instructie is zo'n eenvoudige instructie, maar is een fundamenteel onderdeel van PowerShell. U zult dit meerdere keren gebruiken in bijna elk script dat u schrijft. Ik hoop dat je een beter begrip hebt dan je eerder had.