Delen via


Parameters toevoegen die opdrachtregelinvoer verwerken

Een bron van invoer voor een cmdlet is de opdrachtregel. In dit onderwerp wordt beschreven hoe u een parameter toevoegt aan de Get-Proc-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 aan de cmdlet worden doorgegeven. De Get-Proc cmdlet die hier wordt beschreven, haalt processen op op basis van hun namen en geeft vervolgens informatie weer over de processen bij een opdrachtprompt.

De cmdlet-klasse definiëren

De eerste stap bij het maken van cmdlets is het benoemen van cmdlets en de declaratie van de .NET Framework-klasse waarmee de cmdlet wordt geïmplementeerd. Deze cmdlet haalt procesgegevens op, dus de werkwoordsnaam die hier is gekozen, is 'Get'. (Bijna elk type cmdlet waarmee informatie kan worden opgehaald, kan opdrachtregelinvoer verwerken.) Zie Cmdlet Verb Namesvoor meer informatie over goedgekeurde cmdlet-werkwoorden.

Hier volgt de klassedeclaratie voor de Get-Proc cmdlet. Meer informatie over deze definitie vindt u 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 voor de cmdlet opgeven. In het volgende voorbeeld zijn Get-Proc en Get-Member de namen van cmdlets met pijplijnen en is MemberType een parameter voor de Get-Member-cmdlet. De parameter heeft het argument 'eigenschap'.

PS-> Get-Proc ; Get-Member -MemberType eigenschap

Als u parameters voor een cmdlet wilt declareren, moet u eerst de eigenschappen definiëren die de parameters vertegenwoordigen. In de cmdlet Get-Proc is de enige parameter Name, die in dit geval de naam van het .NET Framework-procesobject vertegenwoordigt dat moet worden opgehaald. Daarom definieert de cmdlet-klasse een eigenschap van het type tekenreeks om een matrix met namen te accepteren.

Hier volgt de parameterdeclaratie voor de parameter Name 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

Als u de Windows PowerShell-runtime wilt informeren dat deze eigenschap de parameter Name is, wordt er een System.Management.Automation.ParameterAttribute-kenmerk toegevoegd aan de eigenschapsdefinitie. De basissyntaxis voor het declareren van dit kenmerk is [Parameter()].

Notitie

Een parameter moet expliciet als openbaar worden gemarkeerd. Parameters die niet zijn gemarkeerd als openbare standaardinstelling voor intern en worden niet gevonden door de Windows PowerShell-runtime.

Deze cmdlet maakt gebruik van een matrix met tekenreeksen voor de parameter Name. Indien mogelijk moet uw cmdlet ook een parameter definiëren als een matrix, omdat hierdoor de cmdlet meer dan één item kan accepteren.

Dingen die u moet 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 Id parameternaam gebruiken om een resource te identificeren, begrijpt de gebruiker gemakkelijk de betekenis van de parameter, ongeacht welke cmdlet ze gebruiken. In principe volgen parameternamen dezelfde regels als die worden gebruikt voor variabelenamen in de Common Language Runtime (CLR). Zie cmdlet-parameternamenvoor meer informatie over parameternamen.

  • Windows PowerShell behoudt zich een paar parameternamen voor om een consistente gebruikerservaring te bieden. Gebruik deze parameternamen niet: WhatIf, Confirm, Verbose, Debug, Warn, ErrorAction, ErrorVariable, OutVariableen OutBuffer. Daarnaast zijn de volgende aliassen voor deze parameternamen gereserveerd: vb, db, ea, ev, oven ob.

  • Name is een eenvoudige en algemene parameternaam die wordt 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 moeilijk te onthouden.

  • Parameters zijn niet hoofdlettergevoelig in Windows PowerShell, hoewel de shell standaard hoofdlettergebruik behoudt. Hoofdlettergevoeligheid van de argumenten is afhankelijk van de werking van de cmdlet. Argumenten worden doorgegeven aan een parameter zoals opgegeven op de opdrachtregel.

  • Zie Cmdlet Parametersvoor 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 enkelvoudige argumenten, meerdere argumenten gescheiden door komma's en Booleaanse instellingen. Een Booleaanse parameter, ook wel een switchgenoemd, verwerkt alleen Booleaanse instellingen. De schakeloptie wordt gebruikt om de aanwezigheid van de parameter te bepalen. De aanbevolen standaardwaarde is false.

De voorbeeld-Get-Proc cmdlet definieert de Name parameter als een positionele parameter met positie 0. Dit betekent dat het eerste argument dat de gebruiker op de opdrachtregel invoert, 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 Position trefwoord uit de kenmerkdeclaratie.

Notitie

Tenzij parameters moeten worden benoemd, raden we u aan om de meest gebruikte parameters positioneel te maken, zodat gebruikers de parameternaam niet hoeven te 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 Name gedefinieerd als optioneel omdat het trefwoord Mandatory niet is ingesteld in de kenmerkdeclaratie.

Ondersteunende parametervalidatie

De voorbeeld-Get-Proc-cmdlet voegt een invoervalidatiekenmerk toe, System.Management.Automation.ValidateNotNullOrEmptyAttribute, aan de parameter Name om validatie in te schakelen dat de invoer niet null of leeg is. Dit kenmerk is een van de verschillende validatiekenmerken die worden geleverd door Windows PowerShell. Zie Parameterinvoer validerenvoor voorbeelden van andere validatiekenmerken.

[Parameter(Position = 0)]
[ValidateNotNullOrEmpty]
public string[] Name

Een invoerverwerkingsmethode overschrijven

Als de cmdlet opdrachtregelinvoer moet verwerken, moet deze de juiste invoerverwerkingsmethoden overschrijven. De basismethoden voor invoerverwerking worden geïntroduceerd in Uw eerste cmdlet maken.

De Get-Proc-cmdlet overschrijft de methode System.Management.Automation.Cmdlet.ProcessRecord voor het afhandelen van de Name parameterinvoer die wordt geleverd door de gebruiker of een script. 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 naar System.Management.Automation.Cmdlet.WriteObject het uitvoermechanisme is voor het verzenden van uitvoerobjecten naar de pijplijn. De tweede parameter van deze aanroep, enumerateCollection, is ingesteld op true om de Windows PowerShell-runtime te informeren om de uitvoermatrix van procesobjecten op te sommen en één proces tegelijk naar de opdrachtregel te 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 door tussen cmdlets 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 door een andere cmdlet wordt geleverd. Zie Objecttypen en Opmaak uitbreidenvoor 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 een Windows PowerShell-module. Zie Cmdlets, providers en hosttoepassingen registrerenvoor 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 volgen twee manieren om de code voor de voorbeeld-cmdlet te testen. Zie Aan de slag met Windows PowerShellvoor meer informatie over het gebruik van cmdlets vanaf de opdrachtregel.

  • Gebruik bij de Windows PowerShell-prompt de volgende opdracht om het Internet Explorer-proces weer te geven, met de naam 'IEXPLORE'.

    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 de processen internet explorer, Outlook en Kladblok weer te geven met de naam 'IEXPLORE', 'OUTLOOK' en 'KLADBLOK'. Als er meerdere processen zijn, worden ze 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 invoer van procespijplijn

uw eerste cmdlet maken

objecttypen en opmaak uitbreiden

Cmdlets, providers en hosttoepassingen registreren

Windows PowerShell-referentie

cmdlet-voorbeelden