Zoeken…


Invoering

Een functie is eigenlijk een benoemd codeblok. Wanneer u de functienaam oproept, wordt het scriptblok binnen die functie uitgevoerd. Het is een lijst met PowerShell-instructies met een naam die u toewijst. Wanneer u een functie uitvoert, typt u de functienaam. Dit is een methode om tijd te besparen bij het uitvoeren van repetitieve taken. PowerShell-indelingen in drie delen: het trefwoord 'Functie', gevolgd door een naam, ten slotte de payload met het scriptblok, dat wordt omsloten door een accolade met accolades / haakjes.

Eenvoudige functie zonder parameters

Dit is een voorbeeld van een functie die een tekenreeks retourneert. In het voorbeeld wordt de functie aangeroepen in een instructie die een waarde toekent aan een variabele. De waarde in dit geval is de retourwaarde van de functie.

function Get-Greeting{
    "Hello World"
}

# Invoking the function
$greeting = Get-Greeting

# demonstrate output
$greeting
Get-Greeting

function verklaart de volgende code als een functie.

Get-Greeting is de naam van de functie. Telkens wanneer die functie in het script moet worden gebruikt, kan de functie worden opgeroepen door hem bij naam aan te roepen.

{ ... } is het scriptblok dat door de functie wordt uitgevoerd.

Als de bovenstaande code wordt uitgevoerd in de ISE, zouden de resultaten ongeveer zo zijn:

Hello World
Hello World

Basisparameters

Een functie kan worden gedefinieerd met parameters met behulp van het param-blok:

function Write-Greeting {
    param(
        [Parameter(Mandatory,Position=0)]
        [String]$name,
        [Parameter(Mandatory,Position=1)]
        [Int]$age
    )
    "Hello $name, you are $age years old."
}

Of met behulp van de eenvoudige functiesyntaxis:

function Write-Greeting ($name, $age) {
    "Hello $name, you are $age years old."
}

Opmerking: Castingparameters zijn niet vereist in beide parameterdefinities.

Simple Function Syntax (SFS) heeft zeer beperkte mogelijkheden in vergelijking met het param-blok.
Hoewel u parameters kunt definiëren om te worden blootgesteld binnen de functie, kun je niet opgeven Parameter attributen , gebruik maken van het valideren van parameters , onder andere [CmdletBinding()] , met SFS (en dit is een niet-limitatieve lijst).

Functies kunnen worden opgeroepen met geordende of benoemde parameters.

De volgorde van de parameters op de aanroep komt overeen met de volgorde van de aangifte in de functiekop (standaard), of kan worden opgegeven met behulp van het Position Positieparameter (zoals getoond in het geavanceerde functievoorbeeld hierboven).

$greeting = Write-Greeting "Jim" 82

Als alternatief kan deze functie worden opgeroepen met benoemde parameters

$greeting = Write-Greeting -name "Bob" -age 82

Verplichte parameters

Parameters voor een functie kunnen als verplicht worden gemarkeerd

function Get-Greeting{
    param
    (
        [Parameter(Mandatory=$true)]$name
    )
    "Hello World $name"
}

Als de functie zonder waarde wordt aangeroepen, vraagt de opdrachtregel om de waarde:

$greeting = Get-Greeting 

cmdlet Get-Greeting at command pipeline position 1
Supply values for the following parameters:
name: 

Geavanceerde functie

Dit is een kopie van het geavanceerde functiefragment van de Powershell ISE. Kortom, dit is een sjabloon voor veel dingen die u kunt gebruiken met geavanceerde functies in Powershell. Belangrijke aandachtspunten:

  • get-help-integratie - het begin van de functie bevat een commentaarblok dat is ingesteld om te worden gelezen door de get-help-cmdlet. Het functieblok kan zich aan het einde bevinden, indien gewenst.
  • cmdletbinding - functie gedraagt zich als een cmdlet
  • parameters
  • parametersets
<#
.Synopsis
   Short description
.DESCRIPTION
   Long description
.EXAMPLE
   Example of how to use this cmdlet
.EXAMPLE
   Another example of how to use this cmdlet
.INPUTS
   Inputs to this cmdlet (if any)
.OUTPUTS
   Output from this cmdlet (if any)
.NOTES
   General notes
.COMPONENT
   The component this cmdlet belongs to
.ROLE
   The role this cmdlet belongs to
.FUNCTIONALITY
   The functionality that best describes this cmdlet
#>
function Verb-Noun
{
    [CmdletBinding(DefaultParameterSetName='Parameter Set 1', 
                  SupportsShouldProcess=$true, 
                  PositionalBinding=$false,
                  HelpUri = 'http://www.microsoft.com/',
                  ConfirmImpact='Medium')]
    [Alias()]
    [OutputType([String])]
    Param
    (
        # Param1 help description
        [Parameter(Mandatory=$true, 
                   ValueFromPipeline=$true,
                   ValueFromPipelineByPropertyName=$true, 
                   ValueFromRemainingArguments=$false, 
                   Position=0,
                   ParameterSetName='Parameter Set 1')]
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [ValidateCount(0,5)]
        [ValidateSet("sun", "moon", "earth")]
        [Alias("p1")] 
        $Param1,

        # Param2 help description
        [Parameter(ParameterSetName='Parameter Set 1')]
        [AllowNull()]
        [AllowEmptyCollection()]
        [AllowEmptyString()]
        [ValidateScript({$true})]
        [ValidateRange(0,5)]
        [int]
        $Param2,

        # Param3 help description
        [Parameter(ParameterSetName='Another Parameter Set')]
        [ValidatePattern("[a-z]*")]
        [ValidateLength(0,15)]
        [String]
        $Param3
    )

    Begin
    {
    }
    Process
    {
        if ($pscmdlet.ShouldProcess("Target", "Operation"))
        {
        }
    }
    End
    {
    }
}

Parameter Validatie

Er zijn verschillende manieren om parameterinvoer te valideren, in PowerShell.

In plaats van code te schrijven in functies of scripts om parameterwaarden te valideren, worden deze ParameterAttributes gegenereerd als ongeldige waarden worden doorgegeven.

ValidateSet

Soms moeten we de mogelijke waarden beperken die een parameter kan accepteren. Stel dat we alleen rood, groen en blauw willen toestaan voor de parameter $Color in een script of functie.

We kunnen het parameterkenmerk ValidateSet gebruiken om dit te beperken. Het heeft als bijkomend voordeel dat bij het instellen van dit argument (in sommige omgevingen) het invullen van tabbladen wordt toegestaan.

param(
    [ValidateSet('red','green','blue',IgnoreCase)]
    [string]$Color
)

U kunt ook IgnoreCase opgeven om IgnoreCase te schakelen.

ValidateRange

Voor deze methode voor parametervalidatie is een minimale en maximale Int32-waarde vereist en moet de parameter zich binnen dat bereik bevinden.

param(
    [ValidateRange(0,120)]
    [Int]$Age
)

ValidatePattern

Deze methode voor parametervalidatie accepteert parameters die overeenkomen met het opgegeven regex-patroon.

param(
    [ValidatePattern("\w{4-6}\d{2}")]
    [string]$UserName
)

ValidateLength

Deze methode voor parametervalidatie test de lengte van de doorgegeven string.

param(
    [ValidateLength(0,15)]
    [String]$PhoneNumber
)

ValidateCount

Deze methode voor parametervalidatie test het aantal doorgegeven argumenten in bijvoorbeeld een reeks tekenreeksen.

param(
    [ValidateCount(1,5)]
    [String[]]$ComputerName
)

ValidateScript

Ten slotte is de ValidateScript-methode buitengewoon flexibel, neemt een scriptblok en evalueert het met $ _ om het doorgegeven argument weer te geven. Vervolgens wordt het argument doorgegeven als het resultaat $ true is (inclusief eventuele uitvoer als geldig).

Dit kan worden gebruikt om te testen of een bestand bestaat:

param(
    [ValidateScript({Test-Path $_})]
    [IO.FileInfo]$Path 
)

Controleren of een gebruiker in AD bestaat:

param(
    [ValidateScript({Get-ADUser $_})]
    [String]$UserName
)

En vrijwel alles wat je kunt schrijven (omdat het niet beperkt is tot oneliners):

param(
    [ValidateScript({
        $AnHourAgo = (Get-Date).AddHours(-1)
        if ($_ -lt $AnHourAgo.AddMinutes(5) -and $_ -gt $AnHourAgo.AddMinutes(-5)) {
            $true
        } else {
            throw "That's not within five minutes. Try again."
        }
    })]
    [String]$TimeAboutAnHourAgo
)


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow