Delen via


about_Functions_Advanced

Korte beschrijving

Introduceert geavanceerde functies die een manier zijn om cmdlets te maken met behulp van scripts.

Lange beschrijving

Een cmdlet is één opdracht die deelneemt aan de pijplijnsemantiek van PowerShell. Dit omvat binaire cmdlets, geavanceerde PowerShell-functies en CDXML-cmdlets.

Met geavanceerde functies kunt u cmdlets maken die zijn geschreven als een PowerShell-functie. Met geavanceerde functies kunt u eenvoudiger cmdlets maken zonder dat u een binaire cmdlet hoeft te schrijven en compileren. Binaire cmdlets zijn .NET-klassen die zijn geschreven in een .NET-taal zoals C#.

Geavanceerde functies gebruiken het kenmerk CmdletBinding om ze te identificeren als functies die fungeren als cmdlets. Het kenmerk CmdletBinding is vergelijkbaar met het cmdlet-kenmerk dat wordt gebruikt in gecompileerde cmdlet-klassen om de klasse te identificeren als een cmdlet. Zie about_Functions_CmdletBindingAttributevoor meer informatie over dit kenmerk.

De parameters van de functie zijn variabelen die zijn gedeclareerd in de instructie param(). U kunt het optionele [Parameter()] kenmerk alleen of in combinatie met het [Alias()] kenmerk of een van de parametervalidatiekenmerken gebruiken. Zie about_Functions_Advanced_Parametersvoor meer informatie over het declareren van parameters.

In het volgende voorbeeld ziet u een functie die een naam accepteert en vervolgens een begroeting afdrukt met behulp van de opgegeven naam. Je merkt ook op dat deze functie een naam definieert die bestaat uit een combinatie van een werkwoord (Send) en een zelfstandig naamwoord (Begroeting), vergelijkbaar met de koppeling van werkwoord en zelfstandig naamwoord in een gecompileerde cmdlet. Functies zijn echter niet verplicht om een werkwoord-zelfstandig naamwoord naam te hebben.

function Send-Greeting
{
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [string]$Name
    )

    process
    {
        Write-Host ("Hello " + $Name + "!")
    }
}

Met deze functie wordt het werk uitgevoerd in het process blok, wat gelijk is aan de methode ProcessingRecord die wordt gebruikt in gecompileerde cmdlets. Het process blok en de andere benoemde blokken worden beschreven in about_Functions_Advanced_Methods.

Geavanceerde functies verschillen van gecompileerde cmdlets op de volgende manieren:

  • Geavanceerde functieparameterbinding genereert geen uitzondering wanneer een matrix met tekenreeksen is gebonden aan een booleaanse parameter.
  • Het kenmerk ValidateSet en het kenmerk ValidatePattern kunnen geen benoemde parameters doorgeven.
  • Geavanceerde functies kunnen niet worden gebruikt in transacties.

PIPELINESTOPTOKEN

Vanaf PowerShell 7.6-preview.4 bevat $PSCmdlet de eigenschap PipelineStopToken die toegang biedt tot een CancellationToken gekoppeld aan de PowerShell-stopgebeurtenisbron. Het token wordt geactiveerd wanneer de PowerShell-pijplijn een aanvraag ontvangt om te stoppen. Gebruik deze met een .NET-methode die een CancellationToken overbelasting accepteert om de methode af te sluiten wanneer dit wordt aangevraagd in plaats van te wachten totdat de methode wordt geretourneerd.

In het volgende voorbeeld roept de functie HttpClient.GetStringAsyncaan, wat tijd kan duren om te reageren wanneer het netwerk traag is of er veel gegevens worden geretourneerd.

function Invoke-CancelableWebRequest {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [string]
        $Url
    )

    $client = [System.Net.Http.HttpClient]::new()
    $client.GetStringAsync(
        $Url,
        $PSCmdlet.PipelineStopToken).GetAwaiter().GetResult()
}

Invoke-CancelableWebRequest -Url https://httpbin.org/delay/10
# Press ctrl+c to cancel

Zie ook