Condividi tramite


Informazioni sui parametri avanzati delle funzioni

Breve descrizione

Viene illustrato come aggiungere parametri alle funzioni avanzate.

Descrizione lunga

È possibile aggiungere parametri alle funzioni avanzate scritte e usare gli attributi e gli argomenti del parametro per limitare i valori dei parametri che gli utenti della funzione inviano con il parametro.

I parametri aggiunti alla funzione sono disponibili per gli utenti oltre ai parametri comuni aggiunti automaticamente da PowerShell a tutti i cmdlet e funzioni avanzate. Per ulteriori informazioni sui parametri comuni di PowerShell, vedere about_CommonParameters.

A partire da PowerShell 3,0, è possibile usare splatting con @Args per rappresentare i parametri in un comando. Splatting è valido in funzioni semplici e avanzate. Per ulteriori informazioni, vedere about_Functions e about_Splatting.

Parametri statici

I parametri statici sono parametri sempre disponibili nella funzione. La maggior parte dei parametri nei cmdlet e negli script di PowerShell sono parametri statici.

Nell'esempio seguente viene illustrata la dichiarazione di un parametro ComputerName con le caratteristiche seguenti:

  • È obbligatorio (obbligatorio).
  • Accetta input dalla pipeline.
  • Accetta una matrice di stringhe come input.
Param(
    [Parameter(Mandatory=$true,
    ValueFromPipeline=$true)]
    [String[]]
    $ComputerName
)

Attributi dei parametri

In questa sezione vengono descritti gli attributi che è possibile aggiungere ai parametri della funzione.

Tutti gli attributi sono facoltativi. Tuttavia, se si omette l'attributo di cmdlet , per essere riconosciuti come funzione avanzata, la funzione deve includere l'attributo Parameter .

È possibile aggiungere uno o più attributi in ogni dichiarazione di parametro. Non esiste alcun limite al numero di attributi che è possibile aggiungere a una dichiarazione di parametro.

Attributo del parametro

L'attributo Parameter viene usato per dichiarare gli attributi dei parametri della funzione.

L'attributo Parameter è facoltativo ed è possibile ometterlo se nessuno dei parametri delle funzioni necessita di attributi. Tuttavia, per essere riconosciuta come funzione avanzata, anziché come funzione semplice, una funzione deve avere l'attributo di cmdlet o l'attributo Parameter oppure entrambe.

L'attributo Parameter presenta argomenti che definiscono le caratteristiche del parametro, ad esempio se il parametro è obbligatorio o facoltativo.

Utilizzare la sintassi seguente per dichiarare l'attributo del parametro , un argomento e un valore dell'argomento. Le parentesi che racchiudono l'argomento e il relativo valore devono seguire il parametro senza spazio corrispondente.

Param(
    [Parameter(Argument=value)]
    $ParameterName
)

Utilizzare le virgole per separare gli argomenti tra parentesi. Utilizzare la sintassi seguente per dichiarare due argomenti dell'attributo Parameter .

Param(
    [Parameter(Argument1=value1,
    Argument2=value2)]
)

Se si utilizza l'attributo Parameter senza argomenti, in alternativa all'utilizzo dell'attributo cmdlet di, le parentesi che seguono il nome dell'attributo sono comunque obbligatorie.

Param(
    [Parameter()]
    $ParameterName
)

Argomento obbligatorio

L' Mandatory argomento indica che il parametro è obbligatorio. Se questo argomento non è specificato, il parametro è facoltativo.

Nell'esempio seguente viene dichiarato il parametro ComputerName . Usa l' Mandatory argomento per rendere obbligatorio il parametro.

Param(
    [Parameter(Mandatory=$true)]
    [String[]]
    $ComputerName
)

Position (argomento)

L' Position argomento determina se il nome del parametro è obbligatorio quando il parametro viene utilizzato in un comando. Quando una dichiarazione di parametro include l' Position argomento, il nome del parametro può essere omesso e PowerShell identifica il valore del parametro senza nome in base alla posizione o all'ordine nell'elenco di valori di parametro senza nome nel comando.

Se l' Position argomento non è specificato, il nome del parametro o l'alias o l'abbreviazione del nome di un parametro deve precedere il valore del parametro ogni volta che il parametro viene usato in un comando.

Per impostazione predefinita, tutti i parametri di funzione sono posizionali. PowerShell assegna i numeri di posizione ai parametri nell'ordine in cui i parametri vengono dichiarati nella funzione. Per disabilitare questa funzionalità, impostare il valore dell' PositionalBinding argomento dell'attributo di cmdlet per $False . L' Position argomento ha la precedenza sul valore dell' PositionalBinding argomento per i parametri su cui è dichiarato. Per ulteriori informazioni, vedere PositionalBinding in about_Functions_CmdletBindingAttribute.

Il valore dell' Position argomento viene specificato come Integer. Il valore position 0 rappresenta la prima posizione nel comando, il valore position 1 rappresenta la seconda posizione nel comando e così via.

Se una funzione non ha parametri posizionali, PowerShell assegna le posizioni a ogni parametro in base all'ordine in cui vengono dichiarati i parametri. Tuttavia, come procedura consigliata, non fare affidamento su questa assegnazione. Quando si desidera che i parametri siano posizionali, utilizzare l' Position argomento.

Nell'esempio seguente viene dichiarato il parametro ComputerName . Usa l' Position argomento con un valore pari a 0. Di conseguenza, quando -ComputerName viene omesso dal comando, il relativo valore deve essere il primo o l'unico valore di parametro senza nome nel comando.

Param(
    [Parameter(Position=0)]
    [String[]]
    $ComputerName
)

Nota

Quando il Get-Help cmdlet Visualizza l'attributo corrispondente del parametro position , il valore della posizione viene incrementato di uno.

Ad esempio, un parametro con un Position valore di argomento uguale a 0 ha un attributo di parametro position = 1.

Argomento ParameterSetName

L' ParameterSetName argomento specifica il set di parametri a cui appartiene un parametro. Se non viene specificato alcun set di parametri, il parametro appartiene a tutti i set di parametri definiti dalla funzione. Pertanto, per essere univoco, ogni set di parametri deve avere almeno un parametro che non è un membro di un altro set di parametri.

Nota

Per un cmdlet o una funzione, è previsto un limite di 32 set di parametri.

Nell'esempio seguente viene dichiarato un parametro ComputerName nel Computer set di parametri, un parametro username nel set di parametri User e un parametro Summary in entrambi i set di parametri.

Param(
    [Parameter(Mandatory=$true,
    ParameterSetName="Computer")]
    [String[]]
    $ComputerName,

    [Parameter(Mandatory=$true,
    ParameterSetName="User")]
    [String[]]
    $UserName,

    [Parameter(Mandatory=$false)]
    [Switch]
    $Summary
)

È possibile specificare un solo ParameterSetName valore in ogni argomento e un solo ParameterSetName argomento in ogni attributo di parametro . Per indicare che un parametro viene visualizzato in più di un set di parametri, aggiungere altri attributi di parametro .

Nell'esempio seguente viene aggiunto esplicitamente il parametro Summary ai Computer User set di parametri e. Il parametro Summary è facoltativo nel Computer set di parametri e obbligatorio nel User set di parametri.

Param(
    [Parameter(Mandatory=$true,
    ParameterSetName="Computer")]
    [String[]]
    $ComputerName,

    [Parameter(Mandatory=$true,
    ParameterSetName="User")]
    [String[]]
    $UserName,

    [Parameter(Mandatory=$false, ParameterSetName="Computer")]
    [Parameter(Mandatory=$true, ParameterSetName="User")]
    [Switch]
    $Summary
)

Per ulteriori informazioni sui set di parametri, vedere set di parametri del cmdlet.

Argomento ValueFromPipeline

L' ValueFromPipeline argomento indica che il parametro accetta input da un oggetto pipeline. Specificare questo argomento se la funzione accetta l'intero oggetto, non solo una proprietà dell'oggetto.

Nell'esempio seguente viene dichiarato un parametro ComputerName che è obbligatorio e accetta un oggetto passato alla funzione dalla pipeline.

Param(
    [Parameter(Mandatory=$true,
    ValueFromPipeline=$true)]
    [String[]]
    $ComputerName
)

Argomento ValueFromPipelineByPropertyName

L' ValueFromPipelineByPropertyName argomento indica che il parametro accetta input da una proprietà di un oggetto pipeline. La proprietà dell'oggetto deve avere lo stesso nome o alias del parametro.

Se, ad esempio, la funzione ha un parametro ComputerName e l'oggetto pipe ha una proprietà ComputerName , il valore della proprietà ComputerName viene assegnato al parametro ComputerName della funzione.

Nell'esempio seguente viene dichiarato un parametro ComputerName che è obbligatorio e accetta input dalla proprietà ComputerName dell'oggetto che viene passata alla funzione tramite la pipeline.

Param(
    [Parameter(Mandatory=$true,
    ValueFromPipelineByPropertyName=$true)]
    [String[]]
    $ComputerName
)

Nota

Un parametro tipizzato che accetta input della pipeline ( by Value ) o ( by PropertyName ) consente l'utilizzo di blocchi di script di associazione ritardata sul parametro.

Il blocco di script di associazione ritardata viene eseguito automaticamente durante l'associazione di parametri. Il risultato viene associato al parametro. L'associazione ritardata non funziona per i parametri definiti come tipo ScriptBlock o System.Object , il blocco di script viene passato senza essere richiamato.

Qui about_Script_Blocks. MDè possibile leggere i blocchi di script di associazione ritardata .

Argomento ValueFromRemainingArguments

L' ValueFromRemainingArguments argomento indica che il parametro accetta tutti i valori del parametro nel comando che non sono assegnati ad altri parametri della funzione.

Esiste un problema noto per l'uso delle raccolte con ValueFromRemainingArguments , in cui la raccolta passata viene considerata come un singolo elemento.

Nell'esempio seguente viene illustrato questo problema noto. Il parametro rimanente deve contenere uno in corrispondenza dell' indice 0 e due in corrispondenza dell' Indice 1. Al contrario, entrambi gli elementi vengono combinati in una singola entità.

function Test-Remainder
{
     param(
         [string]
         [Parameter(Mandatory = $true, Position=0)]
         $Value,
         [string[]]
         [Parameter(Position=1, ValueFromRemainingArguments)]
         $Remaining)
     "Found $($Remaining.Count) elements"
     for ($i = 0; $i -lt $Remaining.Count; $i++)
     {
        "${i}: $($Remaining[$i])"
     }
}
Test-Remainder first one,two
Found 1 elements
0: one two

Nota

Questo problema è stato risolto in PowerShell 6,2.

Argomento HelpMessage

L' HelpMessage argomento specifica una stringa che contiene una breve descrizione del parametro o del relativo valore. PowerShell Visualizza questo messaggio nel prompt visualizzato quando manca un valore di parametro obbligatorio da un comando. Questo argomento non ha alcun effetto sui parametri facoltativi.

Nell'esempio seguente viene dichiarato un parametro ComputerName obbligatorio e un messaggio della guida che illustra il valore del parametro previsto.

Param(
    [Parameter(Mandatory=$true,
    HelpMessage="Enter one or more computer names separated by commas.")]
    [String[]]
    $ComputerName
)

attributo Alias

L'attributo alias stabilisce un nome alternativo per il parametro. Non esiste alcun limite al numero di alias che è possibile assegnare a un parametro.

Nell'esempio seguente viene illustrata una dichiarazione di parametro che aggiunge gli alias CN e machineName al parametro ComputerName obbligatorio.

Param(
    [Parameter(Mandatory=$true)]
    [Alias("CN","MachineName")]
    [String[]]
    $ComputerName
)

Attributi di convalida di parametri e variabili

Gli attributi di convalida consentono a PowerShell di testare i valori dei parametri inviati dagli utenti quando chiamano la funzione avanzata. Se i valori dei parametri non superano il test, viene generato un errore e la funzione non viene chiamata. È anche possibile usare alcuni degli attributi di convalida per limitare i valori che gli utenti possono specificare per le variabili.

Attributo di convalida AllowNull

L'attributo AllowNull consente al valore di un parametro obbligatorio di essere $null . Nell'esempio seguente viene dichiarato un parametro ComputerName che può avere un valore null .

Param(
    [Parameter(Mandatory=$true)]
    [AllowNull()]
    [String]
    $ComputerName
)

Attributo di convalida AllowEmptyString

L'attributo AllowEmptyString consente al valore di un parametro obbligatorio di essere una stringa vuota ( "" ). Nell'esempio seguente viene dichiarato un parametro ComputerName che può avere un valore stringa vuoto.

Param(
    [Parameter(Mandatory=$true)]
    [AllowEmptyString()]
    [String]
    $ComputerName
)

Attributo di convalida AllowEmptyCollection

L'attributo AllowEmptyCollection consente al valore di un parametro obbligatorio di essere una raccolta vuota @() . Nell'esempio seguente viene dichiarato un parametro ComputerName che può avere un valore di raccolta vuoto.

Param(
    [Parameter(Mandatory=$true)]
    [AllowEmptyCollection()]
    [String[]]
    $ComputerName
)

Attributo di convalida ValidateCount

L'attributo ValidateCount specifica il numero minimo e massimo di valori dei parametri accettati da un parametro. PowerShell genera un errore se il numero di valori di parametro nel comando che chiama la funzione non è compreso nell'intervallo.

La dichiarazione di parametro seguente crea un parametro ComputerName che accetta da uno a cinque valori di parametro.

Param(
    [Parameter(Mandatory=$true)]
    [ValidateCount(1,5)]
    [String[]]
    $ComputerName
)

Attributo di convalida ValidateLength

L'attributo validateLength specifica il numero minimo e massimo di caratteri in un parametro o in un valore di variabile. PowerShell genera un errore se la lunghezza di un valore specificato per un parametro o una variabile non è compresa nell'intervallo.

Nell'esempio seguente, ogni nome di computer deve avere da uno a dieci caratteri.

Param(
    [Parameter(Mandatory=$true)]
    [ValidateLength(1,10)]
    [String[]]
    $ComputerName
)

Nell'esempio seguente, il valore della variabile $number deve essere costituito da un minimo di un carattere e da un massimo di dieci caratteri.

[Int32][ValidateLength(1,10)]$number = 01

Attributo di convalida ValidatePattern

L'attributo ValidatePattern specifica un'espressione regolare confrontata con il parametro o il valore della variabile. PowerShell genera un errore se il valore non corrisponde al modello di espressione regolare.

Nell'esempio seguente il valore del parametro deve contenere un numero a quattro cifre e ogni cifra deve essere un numero da zero a nove.

Param(
    [Parameter(Mandatory=$true)]
    [ValidatePattern("[0-9][0-9][0-9][0-9]")]
    [String[]]
    $ComputerName
)

Nell'esempio seguente, il valore della variabile $number deve essere esattamente un numero a quattro cifre e ogni cifra deve essere un numero da zero a nove.

[Int32][ValidatePattern("^[0-9][0-9][0-9][0-9]$")]$number = 1111

Attributo di convalida ValidateRange

L'attributo ValidateRange specifica un intervallo numerico per ogni parametro o valore di variabile. PowerShell genera un errore se un valore non è compreso nell'intervallo. Nell'esempio seguente il valore del parametro dei tentativi deve essere compreso tra zero e dieci.

Param(
    [Parameter(Mandatory=$true)]
    [ValidateRange(0,10)]
    [Int]
    $Attempts
)

Nell'esempio seguente, il valore della variabile $number deve essere compreso tra zero e dieci.

[Int32][ValidateRange(0,10)]$number = 5

Attributo di convalida ValidateScript

L'attributo ValidateScript specifica uno script utilizzato per convalidare un valore di parametro o di variabile. PowerShell invia il valore tramite pipe allo script e genera un errore se lo script restituisce $false o se lo script genera un'eccezione.

Quando si usa l'attributo ValidateScript , il valore che viene convalidato viene mappato alla $_ variabile. È possibile utilizzare la $_ variabile per fare riferimento al valore dello script.

Nell'esempio seguente il valore del parametro elemento eventdate deve essere maggiore o uguale alla data corrente.

Param(
    [Parameter(Mandatory=$true)]
    [ValidateScript({$_ -ge (Get-Date)})]
    [DateTime]
    $EventDate
)

Nell'esempio seguente, il valore della variabile $date deve essere maggiore o uguale alla data e all'ora correnti.

[DateTime][ValidateScript({$_ -ge (Get-Date)})]$date = (Get-Date)

Attributo ValidateSet

L'attributo ValidateSet specifica un set di valori validi per un parametro o una variabile. PowerShell genera un errore se il valore di un parametro o di una variabile non corrisponde a un valore nel set. Nell'esempio seguente il valore del parametro detail può essere solo low, Average o High.

Param(
    [Parameter(Mandatory=$true)]
    [ValidateSet("Low", "Average", "High")]
    [String[]]
    $Detail
)

Nell'esempio seguente, il valore della variabile $flavor deve essere Chocolate, Strawberry o Vanilla.

[ValidateSet("Chocolate", "Strawberry", "Vanilla")]
[String]$flavor = "Strawberry"

La convalida viene eseguita ogni volta che la variabile viene assegnata anche all'interno dello script. Il codice seguente, ad esempio, genera un errore in fase di esecuzione:

Param(
    [ValidateSet("hello", "world")]
    [String]$Message
)

$Message = "bye"

Attributo di convalida ValidateNotNull

L'attributo ValidateNotNull specifica che il valore del parametro non può essere $null . PowerShell genera un errore se il valore del parametro è $null .

L'attributo ValidateNotNull è progettato per essere utilizzato quando il tipo del valore del parametro non è specificato o quando il tipo specificato accetta un valore $null . Se si specifica un tipo che non accetta un $null valore, ad esempio una stringa, il $null valore viene rifiutato senza l'attributo ValidateNotNull perché non corrisponde al tipo specificato.

Nell'esempio seguente, il valore del parametro ID non può essere $null .

Param(
    [Parameter(Mandatory=$true)]
    [ValidateNotNull()]
    $ID
)

Attributo di convalida ValidateNotNullOrEmpty

L'attributo ValidateNotNullOrEmpty specifica che il valore del parametro non può essere $null e non può essere una stringa vuota ( "" ). PowerShell genera un errore se il parametro viene utilizzato in una chiamata di funzione, ma il relativo valore è $null , una stringa vuota ( "" ) o una matrice vuota @() .

Param(
    [Parameter(Mandatory=$true)]
    [ValidateNotNullOrEmpty()]
    [String[]]
    $UserName
)

Parametri dinamici

I parametri dinamici sono parametri di un cmdlet, di una funzione o di uno script disponibili solo in determinate condizioni.

Ad esempio, diversi cmdlet del provider hanno parametri disponibili solo quando il cmdlet viene usato nell'unità del provider o in un percorso specifico dell'unità del provider. Ad esempio, il parametro Encoding è disponibile nei Add-Content cmdlet, Get-Content e Set-Content solo quando viene usato in un'unità file System.

È anche possibile creare un parametro che viene visualizzato solo quando viene usato un altro parametro nel comando della funzione o quando un altro parametro ha un determinato valore.

I parametri dinamici possono essere utili, ma possono essere usati solo quando necessario, in quanto possono essere difficili da rilevare per gli utenti. Per trovare un parametro dinamico, l'utente deve trovarsi nel percorso del provider, usare il parametro ArgumentName del Get-Command cmdlet oppure usare il parametro path di Get-Help .

Per creare un parametro dinamico per una funzione o uno script, usare la DynamicParam parola chiave.

La sintassi è la seguente:

DynamicParam {<statement-list>}

Nell'elenco di istruzioni usare un' If istruzione per specificare le condizioni in cui il parametro è disponibile nella funzione.

Usare il New-Object cmdlet per creare un oggetto System. Management. Automation. RuntimeDefinedParameter per rappresentare il parametro e specificarne il nome.

È possibile usare un New-Object comando per creare un oggetto System. Management. Automation. ParameterAttribute per rappresentare gli attributi del parametro, ad esempio obbligatoria, positiono ValueFromPipeline o il relativo set di parametri.

Nell'esempio seguente viene illustrata una funzione di esempio con parametri standard denominati nome e percorsoe un parametro dinamico facoltativo denominato DP1. Il parametro DP1 si trova nel PSet1 set di parametri ed è di tipo Int32 . Il parametro DP1 è disponibile nella Get-Sample funzione solo quando il valore del parametro path inizia con HKLM: , a indicare che è in uso nell' HKEY_LOCAL_MACHINE unità del registro di sistema.

function Get-Sample {
  [CmdletBinding()]
  Param([String]$Name, [String]$Path)

  DynamicParam
  {
    if ($Path.StartsWith("HKLM:"))
    {
      $attributes = New-Object -Type `
        System.Management.Automation.ParameterAttribute
      $attributes.ParameterSetName = "PSet1"
      $attributes.Mandatory = $false
      $attributeCollection = New-Object `
        -Type System.Collections.ObjectModel.Collection[System.Attribute]
      $attributeCollection.Add($attributes)

      $dynParam1 = New-Object -Type `
        System.Management.Automation.RuntimeDefinedParameter("DP1", [Int32],
          $attributeCollection)

      $paramDictionary = New-Object `
        -Type System.Management.Automation.RuntimeDefinedParameterDictionary
      $paramDictionary.Add("DP1", $dynParam1)
      return $paramDictionary
    }
  }
}

Per ulteriori informazioni, vedere RuntimeDefinedParameter.

Parametri opzionali

I parametri dell'opzione sono parametri senza valore di parametro. Sono efficaci solo quando vengono usati e hanno un solo effetto.

Il parametro noprofile di powershell.exe , ad esempio, è un parametro switch.

Per creare un parametro switch in una funzione, specificare il Switch tipo nella definizione del parametro.

Ad esempio:

Param([Switch]<ParameterName>)

In alternativa, è possibile usare un altro metodo:

Param(
    [Parameter(Mandatory=$false)]
    [Switch]
    $<ParameterName>
)

I parametri dell'opzione sono facili da usare e sono preferiti rispetto ai parametri booleani, che hanno una sintassi più difficile.

Ad esempio, per usare un parametro switch, l'utente digita il parametro nel comando.

-IncludeAll

Per usare un parametro booleano, l'utente digita il parametro e un valore booleano.

-IncludeAll:$true

Quando si creano parametri di opzione, scegliere con attenzione il nome del parametro. Assicurarsi che il nome del parametro comunichi l'effetto del parametro all'utente. Evitare termini ambigui, ad esempio filtro o massimo che potrebbero implicare un valore obbligatorio.

Attributo ArgumentCompleter

L'attributo ArgumentCompleter consente di aggiungere i valori di completamento tramite TAB a un parametro specifico. Analogamente a DynamicParameters, i valori disponibili vengono calcolati in fase di esecuzione quando l'utente preme Tab dopo il nome del parametro.

Per aggiungere un attributo ArgumentCompleter , è necessario definire un blocco di script che determinerà i valori. Il blocco di script deve prendere i parametri seguenti nell'ordine specificato di seguito. I nomi dei parametri non sono importanti perché i valori vengono forniti in modo posizionale.

La sintassi è la seguente:

Param(
    [Parameter(Mandatory)]
    [ArgumentCompleter({
        param ($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameter)
        # Perform calculation of tab completed values here.
    })]
)

Blocco di script ArgumentCompleter

I parametri del blocco di script sono impostati sui valori seguenti:

  • $commandName(Posizione 0)-questo parametro è impostato sul nome del comando per il quale il blocco di script fornisce il completamento tramite tasto TAB.
  • $parameterName(Posizione 1): questo parametro è impostato sul parametro il cui valore richiede il completamento tramite TAB.
  • $wordToComplete(Posizione 2): questo parametro è impostato sul valore specificato dall'utente prima di premere Tab. Il blocco di script deve usare questo valore per determinare i valori di completamento tramite tasto TAB.
  • $commandAst(Posizione 3): questo parametro è impostato sull'albero sintattico astratto (AST) per la riga di input corrente. Per ulteriori informazioni, vedere classe AST.
  • $fakeBoundParameter(Posizione 4): questo parametro è impostato su una tabella hash che contiene l'oggetto $PSBoundParameters per il cmdlet, prima della schedapremuto dall'utente. Per ulteriori informazioni, vedere about_Automatic_Variables.

Il blocco di script ArgumentCompleter deve annullare i valori usando la pipeline, ad esempio ForEach-Object , Where-Object o un altro metodo appropriato. Se si restituisce una matrice di valori, PowerShell considererà l'intera matrice come valore di completamento di una sola scheda.

Nell'esempio seguente viene aggiunto il completamento tramite TAB al parametro value . Se non $Type si specifica alcun oggetto, vengono restituiti frutti e ortaggi. Se $Type viene specificato un oggetto, vengono specificati solo i valori per il tipo. Inoltre, l' -like operatore garantisce che se l'utente digita il comando seguente e usa la funzionalità di completamento tramite tasto TAB , viene restituito solo Apple .

Test-ArgumentCompleter -Type Fruits -Value A

function Test-ArgumentCompleter {
[CmdletBinding()]
 param (
        [Parameter(Mandatory)]
        [ValidateSet('Fruits', 'Vegetables')]
        $Type,
        [Parameter(Mandatory)]
        [ArgumentCompleter( {
            param ( $commandName,
                    $parameterName,
                    $wordToComplete,
                    $commandAst,
                    $fakeBoundParameters )

            $possibleValues = @{
                Fruits = @('Apple', 'Orange', 'Banana')
                Vegetables = @('Tomato', 'Squash', 'Corn')
            }
            if ($fakeBoundParameters.ContainsKey('Type'))
            {
                $possibleValues[$fakeBoundParameters.Type] | Where-Object {
                    $_ -like "$wordToComplete*"
                }
            }
            else
            {
                $possibleValues.Values | ForEach-Object {$_}
            }
        } )]
        $Value
      )
}

Vedere anche

about_Automatic_Variables

about_Functions

about_Functions_Advanced

about_Functions_Advanced_Methods

about_Functions_CmdletBindingAttribute

about_Functions_OutputTypeAttribute