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 en Verbose Debug Warn ErrorAction ErrorVariable OutVariable OutBuffer . Daarnaast zijn de volgende aliassen voor deze parameternamen gereserveerd: vb , , , , en db 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

Uw eerste cmdlet maken

Objecttypen en -opmaak uitbreiden

Cmdlets, providers en hosttoepassingen registreren

Naslaginformatie over Windows PowerShell

Cmdlet-voorbeelden