how-to-build-a-function-in-powershell

Een functie bouwen in PowerShell

Een functie bouwen in PowerShell

Functies komen vaak voor in PowerShell en om de PowerShell taal echt te begrijpen, is het belangrijk dat u weet hoe functies werken. In dit artikel laten we zien hoe een PowerShell functie evolueert van in principe niets helemaal naar het hebben van parameters met behulp van validatiekenmerken. 

Om dit aan te tonen, laten we eerst beginnen met een functie die niet eenvoudiger kan worden.

function Write-Log {
    [CmdletBinding()]
    param()
}

Wanneer deze functie in een PowerShell-sessie wordt uitgevoerd, wordt deze function uitgevoerd, maar doet deze niets omdat er geen code hoeft te worden uitgevoerd. PowerShell voert de functie eenvoudig zelf uit en keert terug.

Om de functie daadwerkelijk iets te laten doen, moeten we wat code toevoegen. Er wordt code toegevoegd tussen het param block en het laatste } teken. Je kunt hieronder zien dat ik mijn Write-Log-functie de string "Ik heb iets gedaan" terug laat sturen naar de console.

 
function Write-Log {
    [CmdletBinding()]
    param()

    'Ik heb iets gedaan'
}

PS> Write-Log
Ik heb iets gedaan

Onze functie heet Write-Log , dus ik ga ervan uit dat dit een functie zal zijn die uiteindelijk een soort tekst naar een logbestand zal schrijven. Omdat we niet elke keer hetzelfde naar een logboekbestand willen schrijven, moeten we een manier bieden om het bericht te wijzigen wanneer de functie wordt uitgevoerd. Om dat te doen, voegen we een parameter toe. Parameters stellen de gebruiker in staat om verschillende waarden door te geven aan de functie tijdens runtime. Hierdoor kan de functie dynamische invoer verzamelen tijdens runtime.

Om een parameter toe te voegen, voeg ik een variabele toe. In dit geval wordt de variabele Message genoemd. Ik zal het toevoegen in het param block zoals hieronder weergegeven. Je kunt dan zien dat ik naar die parameter in de functie zelf kan verwijzen. Wanneer de functie wordt uitgevoerd, retourneert de waarde die ik doorgeef aan de parameter Message .

functie Write-Log {
    [CmdletBinding()]
    param($Message)

    $Message
}

PS> Write-Log -Message 'Ik heb iets gedaan'
Ik heb iets gedaan

U hoeft niet te stoppen bij slechts één parameter. We kunnen er hier zoveel toevoegen als we willen. Hieronder voeg ik een parameter Severity toe, die een waarde geeft wanneer de functie wordt uitgevoerd en u kunt zien dat deze hetzelfde gedrag vertoont.

function Write-Log {
    [CmdletBinding()]
    param($Message, $Severity)

    "$Message - Ernst: $Severity"
}

Write-Log -Message 'Ik heb iets gedaan' -Ernst 1

Nu we weten hoe we met parameters moeten omgaan, kunnen we in parametertypen komen. Een parameter heeft een type zoals al het andere in PowerShell. Hierboven gebruikte het een type, maar het accepteerde elk denkbaar object. De parameter is niet expliciet getypt. Het is een goede gewoonte om dit op alle parameters te doen om ervoor te zorgen dat alleen de waarden die u verwacht, worden doorgegeven.

Om een type te definiëren, kunnen we het type tussen vierkante haken toevoegen vlak voordat de parameter wordt gedeclareerd.

function Write-Log {
    [CmdletBinding()]
    param([System.ServiceProcess.ServiceController]$Message)

    $Message
}

Zodra een expliciet type aan de parameter is toegewezen, accepteert PowerShell alleen invoer van dat type of een object dat kan worden geconverteerd. In dit onderstaande voorbeeld geef ik de booleaanse waarde $false door aan de parameter Message. U kunt zien dat PowerShell dit niet toestaat. Dit komt omdat het een booleaanse tekst niet kan converteren naar een ServiceController-type .

ps1

Als we echter een ServiceController-object passeren dat Get-Service retourneert, werkt het prima.

PS> Write-Log -Message $service

Status    Name                 DisplayName
   ------  ----               -----------
Stopped   AdtAgent           Microsoft Monitoring Agent Audit Fo ...

We kunnen ook parameter attributen gebruiken. Parameterkenmerken stellen ons in staat om verschillende kenmerken van elke parameter te definiëren die bepalen hoe deze werkt. In het onderstaande voorbeeld gebruik ik de parameter Mandatory. Deze kenmerken dwingen de gebruiker een waarde door te geven aan de parameter Message , anders wordt de functie niet uitgevoerd.

Ik stel ook een standaardwaarde in voor de parameter Severity. Hierdoor kan ik de ernst forceren om altijd 1 te zijn , tenzij het tijdens runtime wordt overschreven door een waarde door te geven aan die parameter.

function Write-Log {
    [CmdletBinding()]
    param(
        [Parameter(Verplicht)]
        [string]$Message,

        [Parameter()]
        [int]$Severity = 1
    )

    "$Message - Severity: $Severity"

}

Ten slotte kunnen we parameter validatie attributes gebruiken. Parameter validatie attributen zijn een geweldige manier om te beperken welke waarden aan een parameter worden doorgegeven. In het onderstaande voorbeeld gebruik ik het validatiekenmerk ValidateRange( ). Dit kenmerk wordt gebruikt op parameters van het type integer om een bereik van toegestane getallen te definiëren. In dit voorbeeld sta ik alleen toe dat de waarden van Severity 1-5 zijn. Elke andere waarde die niet in dat bereik valt, mislukt.

function Write-Log {
    [CmdletBinding()]
    param(
        [Parameter(Verplicht)]
        [pscustomobject]$Message,

        [Parameter()]
        [ValidateRange(1, 5)]
        [int]$Severity
    )

    "$Message - Severity: $Severity"
}

Afsluiting

Inmiddels zou u een basiskennis moeten hebben van hoe functies werken in PowerShell. We hebben alles behandeld wat u moet weten om aan de slag te gaan met het bouwen van nuttige functies in PowerShell. Ik moedig je aan om datum en tijden in je scripts toe te voegen en op te merken waar een functie nuttig zou zijn en dan ze beginnen te bouwen. U zult na verloop van tijd zien dat uw code schoner en veel gemakkelijker te lezen wordt.

 

Comments
Comments are disabled in preview mode.