Adam de Automator

bij het maken van PowerShell-functies is het valideren van input voor parameters belangrijk. Parameter validatie kunt u beperken wat wordt doorgegeven aan functies. In dit artikel ga je leren hoe je problemen kunt opvangen voordat ze één worden met het PowerShell ValidateScript validation attribuut.

door parametervalidatie te gebruiken, zorgt u er niet alleen voor dat er geen problemen ontstaan wanneer de functie wordt uitgevoerd, maar bevordert u ook cleaner code omdat de validatielogica niet in het lichaam van de functie wordt geplaatst.

er zijn verschillende geavanceerde eigenschappen voor parametervalidatie beschikbaar in Powershell. Maar in dit artikel leert u over een van de meest flexibele parametervalidaties, PowerShell ValidateScript validation.

u zult zien hoe het werkt en ook voorbeelden zien van hoe het te gebruiken.

inhoudsopgave:

Parametervalidatie (analogie))

validatie van parameters

ik was aan het lunchen en ik had opeens zin in een frisdrank. Ik liep naar de soda machine, trok een bill 100 bill uit mijn zak en stak het aan de bill slot. De machine spuugt het onmiddellijk uit.

toen merkte ik dat net boven de sleuf staat dat het alleen ₱20 en ₱50 biljetten accepteert. Ik eindigde niet met de frisdrank omdat ik alleen had dat ₱100 bill met mij.

en hoe verhoudt het verhaal zich tot de validatie van PowerShell-parameters? Laten we het afbreken.

  • de soda-machine dient als functie
  • de bill is de parameter
  • de bills 50 en ₱20 bills zijn de geldige parameterwaarden
  • de 100 100 werd geweigerd omdat het de verkeerde parameterwaarde
  • als gevolg hiervan heeft de machine mijn verzoek niet verwerkt vanwege de verkeerde invoer. Dus geen frisdrank voor mij. ….en ik had ook dorst.

het bovenstaande scenario voor sodamachines is slechts één analogie om het concept van parametervalidatie te beschrijven.

Parametervalidatie logische stroom

het concept van parametervalidatie volgt een ruwe workflow. De afbeelding hieronder toont een overzicht van hoe parametervalidatie werkt.

PowerShell Parametervalidatiestroom
  1. de functie wordt uitgevoerd in PowerShell door zijn naam aan te roepen en de parameterwaarden
  2. op te geven PowerShell evalueert de opgegeven waarden.
  3. als het resultaat van de validatie waar is, zal PowerShell de functie toestaan om zijn proces voort te zetten, voordat deze wordt afgesloten.
  4. als het resultaat van de validatie onwaar is, zal PowerShell een fout weergeven en zal de functie worden beëindigd.

Walkthrough vereisten

meer dan alleen praten over PowerShell functieparameter validatie, de rest van dit artikel zal voorbeelden bevatten die u zelf kunt kopiëren en uitproberen. Om mee te volgen, heb je een paar dingen nodig om mee te volgen.

  • een Windows 10-computer met een van de onderstaande PowerShell-versies:
  • Windows PowerShell 5.1
  • PowerShell Core 6.2
  • PowerShell Core 7 (laatste versie van dit schrijven is Preview 4)
  • een script-editor naar keuze. Zoals Notepad++, PowerShell ISE of Visual Studio Code.

inzicht in het Validatescript Validation attribuut

ValidateScript is een van de parameter validation attributen beschikbaar voor gebruik in PowerShell geà ntroduceerd in PowerShell 3.0. Het kan worden toegevoegd binnen de parameter definitie blok van een functie, of het kan ook direct worden gebruikt in de PowerShell console.

ValidateScript wordt gebruikt om de waarde van de parameter die u hebt ingevoerd te valideren. Als het validatieresultaat $true is, zal het script doorgaan met draaien. Aan de andere kant, als het resultaat $false is, zal de functie een beëindigingsfout werpen.

laten we eens kijken hoe het werkt.

ValidateScript gebruiken in een functie

het meest voorkomende gebruik van het attribuut ValidateScript is gekoppeld aan een functieparameter. In deze sectie maakt u een dummy-functie en past u validatescript parametervalidatie toe.

de dummy-functie voert de volgende acties uit:

  1. accepteer input voor het bedrag.
  2. valideren als het ingevoerde bedrag gelijk is aan aanvaarde waarden.
  3. voer het proces uit als de validatie is geslaagd.
  4. Geef een fout weer als de validatie is mislukt.

u leert stap voor stap deze functie te bouwen in de volgende sectie. Start uw script editor en beginnen met coderen!

bouw de functie

maak eerst een functie aan en geef het een naam. Dit kan elke naam zijn die je kiest. Het is het beste om de naamgevingsconventie voor het werkwoord te volgen om uw functie beschrijvend te maken. Gebruik in dit voorbeeld de naam Get-Soda.

Function Get-Soda { param ()}

binnen het param() blok, voert u de naam in van de parameter die u gaat gebruiken, die Billis.

Function Get-Soda { param ( $Bill )}

op dit punt voert de functie nog niets uit, behalve om enige waarde voor de Bill parameter te accepteren.

zorg ervoor dat u de Get-Soda functie hebt gekopieerd naar uw PowerShell console. Zodra de functie is geïmporteerd in de PowerShell-sessie, test de functie door het commando: Get-Soda -Bill 100uit te voeren.

wanneer u de functie Get-Soda uitvoert, zult u merken dat er geen fout wordt gemaakt en het doet niets. Dat wordt nu verwacht.

Parametervalidatie

toevoegen misschien wilt u niet toestaan dat alle waarden worden doorgegeven aan de parameter Bill. Met behulp van de analogie uitgelegd aan de bovenkant van dit artikel, zou de functie geen ₱100 biljetten mogen toestaan. Het zou alleen kunnen ₱50 en ₱20 biljetten.

voeg de validatescript-parameter validatie toe door vóór de Bill – parameter in te voegen. Uw functie moet eruit zien als de code hieronder.

Function Get-Soda { param ( $Bill )}

binnen het blok, vul de validatiecode {$_ -eq 20}in. Deze validatiecode controleert of de waarde die aan de bill-parameter wordt verstrekt gelijk is aan 20. Het onderstaande fragment is hoe de code eruit moet zien.

opmerking: de $_ vertegenwoordigt de waarde van de huidige parameter in scope. In dit voorbeeld is de waarde van $_ de waarde van de parameter Bill.

Function Get-Soda { param ( $Bill )}

voer deze functie Nu opnieuw uit om te bevestigen dat de parametervalidatie werkt door het uitvoeren van:

PS51> Get-Soda -Bill 20PS51> Get-Soda -Bill 30

hieronder kunt u zien dat wanneer 20 wordt doorgegeven als een waarde, er niets gebeurt, maar wanneer iets anders dan 20 wordt doorgegeven, het een fout geeft.

fout

als de functie Get-Soda geen fout geeft, betekent dit dat de functie succesvol is uitgevoerd. Om dat aan te tonen, voegt u de volgende code in de functie toe om een bericht terug te sturen naar de console.

Write-Host "$Bill is an accepted value. Please select your soda."

de functie Get-Soda ziet er dan als volgt uit:

geef nu een geaccepteerde waarde als 20 door aan de parameter Bill. U zou het resultaat hieronder moeten zien.

Output van Get-Soda-bill 20

het weergeven van meer betekenisvolle foutmeldingen

ik weet zeker dat je nu al gemerkt hebt dat de foutmelding die wordt weergegeven wanneer de parameterwaarde de validatie niet passeert, niet erg intuïtief en lelijk is.

validatiefout is onduidelijk

helaas, er is niets wat je kunt doen over hoe de fout eruit ziet. Totdat een functie die de opmaak van de validatiefouten mogelijk maakt wordt vrijgegeven (hopelijk), je zit vast met het.

maar het is mogelijk om het een beetje te verbeteren en meer betekenis te geven aan de fouten die uw gebruikers ten goede kunnen komen. U zult het voorbeeld van hoe dat te doen volgende zien.

het toevoegen van aangepaste validatiefout met behulp van Windows PowerShell (5.1)

het uitbreiden van de Get-Soda functie, is het mogelijk om een specifieke foutmelding te geven wanneer de waarde niet voldoet aan de validatie. Om dit te doen, kunt u een if/then construct toevoegen binnen het blok ValidateScript.

Maak een eenvoudige if / then construct zoals in het onderstaande voorbeeld. In dit voorbeeld, als de Bill parameter waarde niet gelijk is aan 20, zal het een foutmelding van uw keuze (X is invalid. Valid value is 20 only.).

u kunt hieronder een voorbeeld zien van hoe dit eruit ziet:

de schermafbeelding hieronder toont de aangepaste Foutmelding in actie. De fout ziet er nog steeds lelijk uit, maar deze keer is de boodschap duidelijk en begrijpelijk.

ValidateScript met een aangepaste foutmelding (PowerShell 5.1)

aangepaste validatiefouten toevoegen met behulp van PowerShell Core (6+)

beginnend met PowerShell Core 6, is de mogelijkheid om aangepaste foutmeldingen toe te voegen aan validatescript parametervalidatie al ingebouwd. Laten we dit de ErrorMessage techniek noemen.

in de gewijzigde Get-Soda functiecode hieronder, bevat het blok nu een ErrorMessage eigenschap die kan worden gebruikt in plaats throw. In plaats van de variabele $_ te gebruiken, kunt u {0} gebruiken die de parameter waarde vertegenwoordigt die is doorgegeven.

de screenshot hieronder laat zien dat de verwachte uitvoer precies hetzelfde is als bij het gebruik van de if-else en throw techniek.

ValidateScript met een aangepaste foutmelding (PowerShell Core 7 voorbeeld 4)

voorbeelden van gebruik van PowerShell ValidateScript

dit zijn enkele praktijkcasescenario ‘ s waarvoor ValidateScript kan worden toegepast. Bekijk en test deze voorbeelden, dan proberen om de foutmelding te verbeteren op uw eigen met behulp van de technieken die u geleerd in de vorige sectie.

Datumparametervalidatie

dit fragment is een functie die een begin-en een einddatum accepteert. Het voert validatie uit dat de ingevoerde datums niet in de toekomst zijn en niet ouder zijn dan 90 dagen.

Test de functie met behulp van deze commando ‘ s. U kunt uw eigen startDate en endDate waarden

opgeven. deze voorbeelduitvoer hieronder is wanneer geldige datumwaarden worden ingevoerd.

zoek-log resultaat met geldige datum parameterwaarden

test het nu opnieuw met startDate die ouder is dan 90 dagen. Bevestig vervolgens dat de foutmelding wordt weergegeven.

Windows Procesparametervalidatie

dit volgende fragment is een functie die de naam van een proces accepteert. Het bevestigt dat het proces wordt uitgevoerd in het geheugen, dan doodt alle lopende instanties van dat proces of exit, afhankelijk van het validatieresultaat.

Test het met dit commando: Kill-Process -Name <process name>

de voorbeelduitvoer hieronder gaat ervan uit dat u test met het proces met de naam Kladblok.

  • het eerste commando is succesvol uitgevoerd omdat het ontdekte dat het Kladblok-proces werd uitgevoerd en vervolgens werd afgebroken.
  • het tweede commando is mislukt omdat notepad niet meer draait en de functie eindigde met de aangepaste foutmelding die u hebt gemaakt.

Fout bij Parametervalidatie

Parameters valideren met een andere parameterwaarde

nu moet u een idee hebben van de waarde van het gebruik van ValidateScript in uw functies. Maar er is één beperking die het vermelden waard is. ValidateScript ‘ s scope is alleen binnen de parameter in gebruik. Dit betekent dat een parameter de waarde van andere parameters NIET kan gebruiken.

als tijdelijke oplossing kan de controle van de parameter-waarde worden uitgevoerd door toegang te krijgen tot de automatische variabele $PSBoundParameters.

misschien heeft u een functie genaamd Send-Spam. Deze functie heeft drie parameters:

  1. From – het e-mailadres van de afzender. (bijvoorbeeld. ). Niet verplicht.
  2. To – het e-mailadres van de ontvanger. (bijvoorbeeld. ). Niet verplicht.
  3. SendEmail – een schakelparameter die geen waarde vereist. Maar indien gebruikt, zijn de parameterwaarden From en To vereist.

als de schakelaar SendEmail wordt gebruikt, wordt een validatiecode uitgevoerd om te bevestigen dat de parameters From en To worden gebruikt. Dan retourneert het de waarde van True. Aan de andere kant, als From en To niet in gebruik zijn, zal de functie een fout werpen en afsluiten.

kopieer en plak de onderstaande code in uw PowerShell-sessie.

het onderstaande commando zal resulteren in een succesvolle validatie. Omdat de parameters From en To samen met de schakelaar SendEmail werden gebruikt.

PS51> Send-Spam -From -To -SendEmail
uitvoer van Send-Spam

test het nu zonder de From of de To parameter te gebruiken. Dit zou moeten resulteren in een fout omdat het validatiescript zal falen. Zie het voorbeeld hieronder.

uitvoeren van Send-Spam zonder de parameter naar

ValidateScript gebruiken in de Console

hoewel het attribuut ValidateScript het meest gebruikt wordt om functieparameters te valideren, kan het ook direct vanuit de PowerShell-console worden gebruikt. ValidateScript is handig voor het testen van uw validatiecode, zelfs voordat u deze in een script of een functie opneemt.

hieronder zijn enkele voorbeelden van het gebruik van ValidateScript buiten een functie.

valideren van gehele waarde

dit voorbeeld hieronder valideert dat een gegeven gehele waarde groter is dan vijf.

$i=4

na het uitvoeren van de bovenstaande code mislukt het verwachte resultaat omdat de gegeven waarde 4 is, wat minder is dan 5. Het voorbeeld screenshot hieronder is wat je zou verwachten te zien.

validatie mislukt

valideren van een datum waarde

de volgende voorbeeld code hieronder laat zien hoe te valideren dat de gegeven datum nieuwer is dan of gelijk is aan de huidige datum.

$date = (Get-Date)$date = (Get-Date).AddHours(-1)

na het uitvoeren van de eerste regel van de code in het bovenstaande fragment, wordt het verwachte resultaat doorgegeven (True) omdat de opgegeven DateTime waarde gelijk is of een paar seconden groter.

de tweede regel code zal een mislukt resultaat produceren omdat de DateTime waarde één uur minder is dan de huidige tijd. Zie de screenshot hieronder voor de voorbeelduitvoer.

datum parameter validatie fout

samenvatting

In dit artikel hebt u geleerd wat parametervalidatie is en hoe u het attribuut validatescript parametervalidatie kunt gebruiken.

u hebt ook geleerd hoe u de mogelijkheid om een meer beschrijvende foutmelding weer te geven kunt uitbreiden. Tijdens het volgen van de voorbeelden, heb je de resultaten van zowel succesvolle als mislukte validatie ervaren.

u moet nu de beperking van ValidateScript begrijpen in termen van cross-parameter verwijzingen, en hoe u die beperking kunt omzeilen door gebruik te maken van de $PSBoundParameters automatische variabele.

ik hoop dat je genoeg geleerd hebt in dit artikel dat je kunt toepassen in je PowerShell tool-making journey!

verder lezen

  • Powershell-functies Inleiding
  • PowerShell-Modules begrijpen en bouwen
  • ValidateScript validation attribuut
  • About Throw

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.