Share via


Parametersets toevoegen aan een cmdlet

Wat u moet weten over parametersets

Windows PowerShell definieert een parameterset als een groep parameters die samen werken. Door de parameters van een cmdlet te groeperen, kunt u één cmdlet maken die de functionaliteit ervan kan wijzigen op basis van welke groep parameters de gebruiker op geeft.

Een voorbeeld van een cmdlet die gebruikmaakt van twee parametersets om verschillende functies te definiëren, is de cmdlet die wordt geleverd Get-EventLog door Windows PowerShell. Deze cmdlet retourneert verschillende informatie wanneer de gebruiker de List parameter of LogName opgeeft. Als de LogName parameter is opgegeven, retourneert de cmdlet informatie over de gebeurtenissen in een bepaald gebeurtenislogboek. Als de List parameter is opgegeven, retourneert de cmdlet informatie over de logboekbestanden zelf (niet de gebeurtenisgegevens die ze bevatten). In dit geval identificeren de List parameters en twee afzonderlijke LogName parametersets.

Twee belangrijke dingen om te onthouden over parametersets is dat de Windows PowerShell-runtime slechts één parameterset gebruikt voor een bepaalde invoer en dat elke parameterset ten minste één parameter moet hebben die uniek is voor die parameterset.

Ter illustratie van dat laatste punt gebruikt Stop-Proc cmdlet drie parametersets: ProcessName , ProcessId en InputObject . Elk van deze parametersets heeft één parameter die zich niet in de andere parametersets. De parametersets kunnen andere parameters delen, maar de cmdlet gebruikt de unieke parameters , en om te bepalen welke set parameters de Windows PowerShell ProcessName ProcessId InputObject runtime moet gebruiken.

De cmdlet-klasse declareren

De eerste stap bij het maken van de cmdlet is het altijd benoemen van de cmdlet en het declareren van de .NET-klasse die de cmdlet implementeert. Voor deze cmdlet wordt het levenscycluswerkwoord 'Stoppen' gebruikt omdat de cmdlet systeemprocessen stopt. De naam van het zelfstandig naamwoord 'Proc' wordt gebruikt omdat de cmdlet werkt op processen. In de onderstaande declaratie worden de cmdlet-woorden en naamwoorden weerspiegeld in de naam van de cmdlet-klasse.

Notitie

Zie cmdlet werkwoordnamen voor meer informatie over goedgekeurde namen van cmdlet-woorden.

De volgende code is de klassedefinitie voor deze Stop-Proc cmdlet.

[Cmdlet(VerbsLifecycle.Stop, "Proc",
        DefaultParameterSetName = "ProcessId",
        SupportsShouldProcess = true)]
public class StopProcCommand : PSCmdlet
<Cmdlet(VerbsLifecycle.Stop, "Proc", DefaultParameterSetName:="ProcessId", _
SupportsShouldProcess:=True)> _
Public Class StopProcCommand
    Inherits PSCmdlet

De parameters van de cmdlet declareren

Deze cmdlet definieert drie parameters die nodig zijn als invoer voor de cmdlet (deze parameters definiëren ook de parametersets), evenals een parameter die beheert wat de cmdlet doet en een parameter die bepaalt of de cmdlet een uitvoerobject via de pijplijn Force PassThru verzendt. Deze cmdlet geeft standaard geen object door aan de pijplijn. Zie Creating a Cmdlet that Modifies the System(Een cmdlet maken die het systeem wijzigt) voor meer informatie over deze laatste twee parameters.

De naamparameter declareren

Met deze invoerparameter kan de gebruiker de namen opgeven van de processen die moeten worden gestopt. Houd er rekening mee dat het kenmerktrefwoord van het kenmerk ParameterSetName System.Management.Automation.Parameterattribute de ProcessName parameterset voor deze parameter specificeert.

[Parameter(
   Position = 0,
   ParameterSetName = "ProcessName",
   Mandatory = true,
   ValueFromPipeline = true,
   ValueFromPipelineByPropertyName = true,
   HelpMessage = "The name of one or more processes to stop. Wildcards are permitted."
)]
[Alias("ProcessName")]
public string[] Name
{
    get { return processNames; }
    set { processNames = value; }
}
private string[] processNames;
<Parameter(Position:=0, ParameterSetName:="ProcessName", _
Mandatory:=True, _
ValueFromPipeline:=True, ValueFromPipelineByPropertyName:=True, _
HelpMessage:="The name of one or more processes to stop. " & _
    "Wildcards are permitted."), [Alias]("ProcessName")> _
Public Property Name() As String()
    Get
        Return processNames
    End Get
    Set(ByVal value As String())
        processNames = value
    End Set
End Property

Private processNames() As String

Houd er ook rekening mee dat de alias 'ProcessName' aan deze parameter wordt gegeven.

De id-parameter declareren

Met deze invoerparameter kan de gebruiker de id's opgeven van de processen die moeten worden gestopt. Houd er rekening mee ParameterSetName dat het kenmerktrefwoord van het kenmerk System.Management.Automation.Parameterattribute de ProcessId parameterset specificeert.

[Parameter(
           ParameterSetName = "ProcessId",
           Mandatory = true,
           ValueFromPipelineByPropertyName = true,
           ValueFromPipeline = true
)]
[Alias("ProcessId")]
public int[] Id
{
  get { return processIds; }
  set { processIds = value; }
}
private int[] processIds;
<Parameter(ParameterSetName:="ProcessId", _
Mandatory:=True, _
ValueFromPipelineByPropertyName:=True, _
ValueFromPipeline:=True), [Alias]("ProcessId")> _
Public Property Id() As Integer()
    Get
        Return processIds
    End Get
    Set(ByVal value As Integer())
        processIds = value
    End Set
End Property
Private processIds() As Integer

Houd er ook rekening mee dat de alias 'ProcessId' aan deze parameter wordt gegeven.

De Parameter InputObject declareren

Met deze invoerparameter kan de gebruiker een invoerobject opgeven dat informatie bevat over de processen die moeten worden gestopt. Houd er rekening mee dat het kenmerktrefwoord van het kenmerk ParameterSetName System.Management.Automation.Parameterattribute de InputObject parameterset voor deze parameter specificeert.

[Parameter(
           ParameterSetName = "InputObject",
           Mandatory = true,
           ValueFromPipeline = true)]
public Process[] InputObject
{
  get { return inputObject; }
  set { inputObject = value; }
}
private Process[] inputObject;
<Parameter(ParameterSetName:="InputObject", _
Mandatory:=True, ValueFromPipeline:=True)> _
Public Property InputObject() As Process()
    Get
        Return myInputObject
    End Get
    Set(ByVal value As Process())
        myInputObject = value
    End Set
End Property
Private myInputObject() As Process

Houd er ook rekening mee dat deze parameter geen alias heeft.

Parameters declareren in meerdere parametersets

Hoewel er een unieke parameter voor elke parameterset moet zijn, kunnen parameters tot meer dan één parameterset behoren. In dergelijke gevallen geeft u de gedeelde parameter een Declaratie van het kenmerk System.Management.Automation.Parameterattribute voor elke set waarvan de parameter deel uitmaken. Als een parameter in alle parametersets staat, hoeft u het parameterkenmerk slechts één keer te declaren en hoeft u de naam van de parameterset niet op te geven.

Een invoerverwerkingsmethode overschrijven

Elke cmdlet moet een invoerverwerkingsmethode overschrijven. Meestal is dit de methode System.Management.Automation.Cmdlet.ProcessRecord. In deze cmdlet wordt de methode System.Management.Automation.Cmdlet.ProcessRecord overgenomen, zodat de cmdlet een groot aantal processen kan verwerken. Het bevat een Select-instructie die een andere methode aanroept op basis van de parameterset die de gebruiker heeft opgegeven.

protected override void ProcessRecord()
{
  switch (ParameterSetName)
  {
    case "ProcessName":
         ProcessByName();
         break;

    case "ProcessId":
         ProcessById();
         break;

    case "InputObject":
         foreach (Process process in inputObject)
         {
           SafeStopProcess(process);
         }
         break;

    default:
         throw new ArgumentException("Bad ParameterSet Name");
  } // switch (ParameterSetName...
} // ProcessRecord
Protected Overrides Sub ProcessRecord()
    Select Case ParameterSetName
        Case "ProcessName"
            ProcessByName()

        Case "ProcessId"
            ProcessById()

        Case "InputObject"
            Dim process As Process
            For Each process In myInputObject
                SafeStopProcess(process)
            Next process

        Case Else
            Throw New ArgumentException("Bad ParameterSet Name")
    End Select

End Sub 'ProcessRecord ' ProcessRecord

De Helper-methoden die worden aangeroepen door de select-instructie worden hier niet beschreven, maar u kunt de implementatie ervan zien in het volledige codevoorbeeld in de volgende sectie.

Codevoorbeeld

Zie StopProcessSample04Sample voor de volledige C#-voorbeeldcode.

Objecttypen en opmaak definiëren

Windows PowerShell geeft informatie door tussen cmdlets met behulp van .NET-objecten. Daarom moet een cmdlet mogelijk een eigen type definiëren, of moet de cmdlet mogelijk een bestaand type uitbreiden dat wordt geleverd door een andere cmdlet. Zie Extending Object Types and Formatting (Objecttypen uitbreiden en formatteren) voor meer informatie over het definiëren van nieuwe typen of het uitbreiden van bestaande typen.

De cmdlet bouwen

Nadat u een cmdlet hebt geïmplementeerd, moet u deze registreren bij Windows PowerShell via Windows PowerShell-module. Zie How to Register Cmdlets, Providers, and Host Applications (Cmdlets,providers en hosttoepassingen registreren) voor meer informatie over het registreren van cmdlets.

De cmdlet testen

Wanneer uw cmdlet is geregistreerd bij Windows PowerShell test u deze door deze uit te voeren op de opdrachtregel. Hier volgen enkele tests die laten zien hoe de parameters en kunnen worden gebruikt om ProcessId InputObject de parametersets te testen om een proces te stoppen.

  • Als Windows PowerShell gestart, moet Stop-Proc cmdlet uitvoeren met de parameterset om een proces op basis van de id ProcessId te stoppen. In dit geval gebruikt de cmdlet de ProcessId parameterset om het proces te stoppen.

    PS> stop-proc -Id 444
    Confirm
    Are you sure you want to perform this action?
    Performing operation "stop-proc" on Target "notepad (444)".
    [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): Y
    
  • Als Windows PowerShell gestart, moet u de cmdlet Stop-Proc uitvoeren met de parameter ingesteld om processen op het Kladblok-object te stoppen dat met de opdracht InputObject is Get-Process opgehaald.

    PS> get-process notepad | stop-proc
    Confirm
    Are you sure you want to perform this action?
    Performing operation "stop-proc" on Target "notepad (444)".
    [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): N
    

Zie ook

Een cmdlet maken waarmee het systeem wordt gewijzigd

Een cmdlet Windows PowerShell maken

Objecttypen en -opmaak uitbreiden

Cmdlets, providers en hosttoepassingen registreren

Windows PowerShell SDK