Parameters toevoegen die opdrachtregelinvoer verwerken
Een invoerbron voor een cmdlet is de opdrachtregel. In dit onderwerp wordt beschreven hoe u een parameter toevoegt aan de cmdlet (die wordt beschreven in Uw eerste cmdlet maken), zodat de cmdlet invoer van de lokale computer kan verwerken op basis van expliciete objecten die worden doorgegeven aan de Get-Proc
cmdlet. De cmdlet die hier wordt beschreven, haalt processen op basis van hun namen op en geeft vervolgens informatie weer over de Get-Proc
processen bij een opdrachtprompt.
De cmdlet-klasse definiëren
De eerste stap bij het maken van cmdlet is het benoemen van cmdlet's en de declaratie van de .NET Framework klasse die de cmdlet implementeert. Met deze cmdlet worden procesgegevens opgehaald, dus de hier gekozen werkwoordnaam is 'Ophalen'. (Bijna elk soort cmdlet waarmee informatie kan worden opgehaald, kan opdrachtregelinvoer verwerken.) Zie cmdlet werkwoordnamen voor meer informatie over goedgekeurde cmdlet-woorden.
Hier is de klassedeclaratie voor de Get-Proc
cmdlet . Meer informatie over deze definitie kunt u bekijken in Uw eerste cmdlet maken.
[Cmdlet(VerbsCommon.Get, "proc")]
public class GetProcCommand: Cmdlet
<Cmdlet(VerbsCommon.Get, "Proc")> _
Public Class GetProcCommand
Inherits Cmdlet
Parameters declareren
Met een cmdlet-parameter kan de gebruiker invoer opgeven voor de cmdlet. In het volgende voorbeeld zijn Get-Proc
en de namen van cmdlets met Get-Member
pijplijnen en is een parameter voor MemberType
de Get-Member
cmdlet. De parameter heeft het argument 'eigenschap'.
PS> get-proc ; get-member
Eigenschap -membertype
Als u parameters voor een cmdlet wilt declareeren, moet u eerst de eigenschappen definiëren die de parameters vertegenwoordigen. In de cmdlet is de enige parameter , die in dit geval de naam vertegenwoordigt van het Get-Proc
Name
.NET Framework procesobject dat moet worden opgehaald. Daarom definieert de cmdlet-klasse een eigenschap van het type tekenreeks om een matrix met namen te accepteren.
Hier is de parameterdeclaratie voor de Name
parameter van de Get-Proc
cmdlet .
/// <summary>
/// Specify the cmdlet Name parameter.
/// </summary>
[Parameter(Position = 0)]
[ValidateNotNullOrEmpty]
public string[] Name
{
get { return processNames; }
set { processNames = value; }
}
private string[] processNames;
#endregion Parameters
<Parameter(Position:=0), ValidateNotNullOrEmpty()> _
Public Property Name() As String()
Get
Return processNames
End Get
Set(ByVal value As String())
processNames = value
End Set
End Property
Om de Windows PowerShell te informeren dat deze eigenschap de parameter is, wordt het kenmerk Name
System.Management.Automation.Parameterattribute toegevoegd aan de eigenschapsdefinitie. De basissyntaxis voor het declareren van dit kenmerk is [Parameter()]
.
Notitie
Een parameter moet expliciet worden gemarkeerd als openbaar. Parameters die niet als openbare standaardwaarde zijn gemarkeerd op intern en die niet worden gevonden door de Windows PowerShell runtime.
Deze cmdlet maakt gebruik van een matrix met tekenreeksen voor de Name
parameter . Indien mogelijk moet uw cmdlet ook een parameter definiëren als een matrix, omdat hiermee de cmdlet meer dan één item kan accepteren.
Dingen om te onthouden over parameterdefinities
Vooraf gedefinieerde Windows PowerShell parameternamen en gegevenstypen moeten zoveel mogelijk opnieuw worden gebruikt om ervoor te zorgen dat uw cmdlet compatibel is met Windows PowerShell cmdlets. Als alle cmdlets bijvoorbeeld de vooraf gedefinieerde parameternaam gebruiken om een resource te identificeren, begrijpt de gebruiker gemakkelijk de betekenis van de parameter, ongeacht welke
Id
cmdlet ze gebruiken. In principe volgen parameternamen dezelfde regels als de regels die worden gebruikt voor namen van variabelen in de Common Language Runtime (CLR). Zie Cmdlet Parameter Names (Cmdlet-parameternamen) voor meerinformatie over parameternamen.Windows PowerShell reserveert enkele parameternamen om een consistente gebruikerservaring te bieden. Gebruik deze parameternamen niet:
WhatIf
, , , , , , , ,Confirm
enVerbose
Debug
Warn
ErrorAction
ErrorVariable
OutVariable
OutBuffer
. Daarnaast zijn de volgende aliassen voor deze parameternamen gereserveerd:vb
, , , , endb
ea
ev
ov
ob
.Name
is een eenvoudige en algemene parameternaam, aanbevolen voor gebruik in uw cmdlets. Het is beter om een parameternaam als deze te kiezen dan een complexe naam die uniek is voor een specifieke cmdlet en die moeilijk te onthouden is.Parameters zijn niet-casegevoelig in Windows PowerShell, hoewel de shell standaard case behoudt. De casegevoeligheid van de argumenten is afhankelijk van de werking van de cmdlet. Argumenten worden doorgegeven aan een parameter zoals opgegeven op de opdrachtregel.
Zie Cmdlet Parameters (Cmdlet-parameters) voor voorbeelden van andere parameterdeclaraties.
Parameters declareren als positioneel of benoemd
Een cmdlet moet elke parameter instellen als een positionele of benoemde parameter. Beide soorten parameters accepteren enkele argumenten, meerdere argumenten gescheiden door komma's en Booleaanse instellingen. Een Booleaanse parameter, ook wel een switch genoemd, verwerkt alleen Booleaanse instellingen. De switch wordt gebruikt om de aanwezigheid van de parameter te bepalen. De aanbevolen standaardwaarde is false
.
De Get-Proc
voorbeeld-cmdlet Name
definieert de parameter als een positionele parameter met positie
0. Dit betekent dat het eerste argument dat de gebruiker invoert op de opdrachtregel automatisch wordt ingevoegd voor deze parameter. Als u een benoemde parameter wilt definiëren waarvoor de gebruiker de parameternaam van de opdrachtregel moet opgeven, laat u het trefwoord buiten Position
de kenmerkdeclaratie.
Notitie
Tenzij parameters een naam moeten krijgen, raden we u aan de meest gebruikte parameters positioneel te maken, zodat gebruikers de parameternaam niet moeten typen.
Parameters declareren als verplicht of optioneel
Een cmdlet moet elke parameter instellen als een optionele of een verplichte parameter. In de Get-Proc
voorbeeld-cmdlet wordt de parameter gedefinieerd als optioneel omdat het sleutelwoord Name
niet is ingesteld in de Mandatory
kenmerkdeclaratie.
Validatie van ondersteunende parameters
De voorbeeld-cmdlet voegt een invoervalidatiekenmerk Get-Proc
System.Management.Automation.Validatenotnulloremptyattributetoe aan de parameter om de validatie in te stellen dat de invoer noch leeg Name
null
is. Dit kenmerk is een van de verschillende validatiekenmerken die door Windows PowerShell. Zie Validating Parameter Input (Parameterinvoer valideren) voor voorbeelden van andere validatiekenmerken.
[Parameter(Position = 0)]
[ValidateNotNullOrEmpty]
public string[] Name
Een invoerverwerkingsmethode overschrijven
Als uw cmdlet opdrachtregelinvoer moet verwerken, moet deze de juiste invoerverwerkingsmethoden overschrijven. De eenvoudige invoerverwerkingsmethoden zijn geïntroduceerd in Uw eerste cmdlet maken.
De Get-Proc
cmdlet overschrijven de methode System.Management.Automation.Cmdlet.ProcessRecord om de parameterinvoer van de gebruiker of een Name
script te verwerken. Met deze methode worden de processen voor elke aangevraagde procesnaam of alle processen opgevraagd als er geen naam is opgegeven. U ziet dat in System.Management.Automation.Cmdlet.ProcessRecordde aanroep van System.Management.Automation.Cmdlet.WriteObject%28System.Object%2CSystem.Boolean%29 het uitvoermechanisme is voor het verzenden van uitvoerobjecten naar de pijplijn. De tweede parameter van deze aanroep, , is ingesteld op om de enumerateCollection
Windows PowerShell-runtime te informeren over het opsnoemen van de uitvoermatrice met procesobjecten en één proces per keer naar de opdrachtregel te true
schrijven.
protected override void ProcessRecord()
{
// If no process names are passed to the cmdlet, get all processes.
if (processNames == null)
{
// Write the processes to the pipeline making them available
// to the next cmdlet. The second argument of this call tells
// PowerShell to enumerate the array, and send one process at a
// time to the pipeline.
WriteObject(Process.GetProcesses(), true);
}
else
{
// If process names are passed to the cmdlet, get and write
// the associated processes.
foreach (string name in processNames)
{
WriteObject(Process.GetProcessesByName(name), true);
}
}
}
Protected Overrides Sub ProcessRecord()
'/ If no process names are passed to the cmdlet, get all processes.
If processNames Is Nothing Then
Dim processes As Process()
processes = Process.GetProcesses()
End If
'/ If process names are specified, write the processes to the
'/ pipeline to display them or make them available to the next cmdlet.
For Each name As String In processNames
'/ The second parameter of this call tells PowerShell to enumerate the
'/ array, and send one process at a time to the pipeline.
WriteObject(Process.GetProcessesByName(name), True)
Next
End Sub 'ProcessRecord
Codevoorbeeld
Zie GetProcessSample02 Samplevoor de volledige C#-voorbeeldcode.
Objecttypen en -opmaak definiëren
Windows PowerShell geeft informatie tussen cmdlets door met behulp van .NET Framework-objecten. Daarom moet een cmdlet mogelijk een eigen type definiëren, of moet een cmdlet mogelijk een bestaand type uitbreiden dat wordt geleverd door een andere cmdlet. Zie Extending Object Types and Formatting (Objecttypen uitbreiden en opmaak) 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 met behulp van Windows PowerShell module. Zie Cmdlets, providers en hosttoepassingen registreren voor meer informatie over het registreren van cmdlets.
De cmdlet testen
Wanneer uw cmdlet is geregistreerd bij Windows PowerShell, kunt u deze testen door deze uit te voeren op de opdrachtregel. Hier zijn twee manieren om de code voor de voorbeeld-cmdlet te testen. Zie voor meer informatie over het gebruik van cmdlets vanaf de opdrachtregel Aan de slag met Windows PowerShell.
Gebruik bij Windows PowerShell opdrachtprompt de volgende opdracht om het Internet Explorer met de naam 'IEXPLORE' weer te geven.
get-proc -name iexplore
De volgende uitvoer wordt weergegeven.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 354 11 10036 18992 85 0.67 3284 iexplore
Gebruik de volgende opdracht om Internet Explorer, Outlook en Kladblok processen met de naam 'IEXPLORE', 'OUTLOOK' en 'KLADBLOK' weer te geven. Als er meerdere processen zijn, worden deze allemaal weergegeven.
get-proc -name iexplore, outlook, notepad
De volgende uitvoer wordt weergegeven.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 732 21 24696 5000 138 2.25 2288 iexplore 715 19 20556 14116 136 1.78 3860 iexplore 3917 62 74096 58112 468 191.56 1848 OUTLOOK 39 2 1024 3280 30 0.09 1444 notepad 39 2 1024 356 30 0.08 3396 notepad
Zie ook
Parameters toevoegen die pijplijninvoer verwerken
Objecttypen en -opmaak uitbreiden
Cmdlets, providers en hosttoepassingen registreren