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 deProcessId
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
isGet-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
Feedback
https://aka.ms/ContentUserFeedback.
Binnenkort beschikbaar: In de loop van 2024 zullen we GitHub-problemen geleidelijk uitfaseren als het feedbackmechanisme voor inhoud en deze vervangen door een nieuw feedbacksysteem. Zie voor meer informatie:Feedback verzenden en weergeven voor