Lägga till parametrar som bearbetar kommandoradsindata

En källa för indata för en cmdlet är kommandoraden. Det här avsnittet beskriver hur du lägger till en parameter i cmdleten (vilket beskrivs i Skapa din första cmdlet ) så att cmdleten kan bearbeta indata från den lokala datorn baserat på explicita objekt som skickas till Get-Proc cmdleten. Cmdleten som beskrivs här hämtar processer baserat på deras namn Get-Proc och visar sedan information om processerna i en kommandotolk.

Definiera cmdlet-klassen

Det första steget i att skapa cmdlet är cmdlet-namngivning och deklaration av den .NET Framework som implementerar cmdleten . Den här cmdleten hämtar processinformation, så verbnamnet som valts här är "Get". (Nästan alla slags cmdlet som kan hämta information kan bearbeta kommandoradsindata.) Mer information om godkända cmdlet-verb finns i Cmdlet-verbnamn.

Här är klassdeklarationen för Get-Proc cmdleten . Information om den här definitionen finns i Skapa din första cmdlet.

[Cmdlet(VerbsCommon.Get, "proc")]
public class GetProcCommand: Cmdlet
<Cmdlet(VerbsCommon.Get, "Proc")> _
Public Class GetProcCommand
    Inherits Cmdlet

Deklarera parametrar

Med en cmdlet-parameter kan användaren ange indata till cmdleten. I följande exempel är Get-Proc och Get-Member namnen på pipeline-cmdletarna och MemberType är en parameter för Get-Member cmdleten . Parametern har argumentet "property".

PS> get-proc ; get-member -membertype-egenskap

Om du vill deklarera parametrar för en cmdlet måste du först definiera de egenskaper som representerar parametrarna. I cmdleten är den enda parametern , som i det här fallet representerar namnet Get-Proc Name på .NET Framework processobjektet som ska hämtas. Därför definierar cmdlet-klassen en egenskap av typen sträng för att acceptera en matris med namn.

Här är parameterdeklarationen för Name parametern för Get-Proc cmdleten .

/// <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

För att Windows PowerShell den här egenskapen är Name parametern läggs attributet System.Management.Automation.Parameterattribute till i egenskapsdefinitionen. Den grundläggande syntaxen för att deklarera det här attributet är [Parameter()] .

Anteckning

En parameter måste uttryckligen markeras som offentlig. Parametrar som inte har markerats som offentlig standard som interna och som inte hittas av Windows PowerShell-körningen.

Den här cmdleten använder en matris med strängar för Name parametern . Om möjligt bör cmdleten också definiera en parameter som en matris, eftersom det gör att cmdleten kan acceptera fler än ett objekt.

Saker att komma ihåg om parameterdefinitioner

  • Fördefinierade Windows PowerShell parameternamn och datatyper bör återanvändas så mycket som möjligt för att säkerställa att din cmdlet är kompatibel med Windows PowerShell cmdlets. Om till exempel alla cmdlets använder det fördefinierade parameternamnet för att identifiera en resurs, kommer användaren enkelt att förstå innebörden av parametern, oavsett vilken Id cmdlet de använder. Parameternamn följer i princip samma regler som de som används för variabelnamn i CLR (Common Language Runtime). Mer information om namngivning av parametrar finns i Cmdlet parameternamn.

  • Windows PowerShell reserverar några parameternamn för att ge en konsekvent användarupplevelse. Använd inte dessa parameternamn: WhatIf , , , , , , , Confirm och Verbose Debug Warn ErrorAction ErrorVariable OutVariable OutBuffer . Dessutom är följande alias för dessa parameternamn reserverade: vb , , , , och db ea ev ov ob .

  • Name är ett enkelt och vanligt parameternamn som rekommenderas för användning i dina cmdlets. Det är bättre att välja ett parameternamn som det här än ett komplext namn som är unikt för en specifik cmdlet och svårt att komma ihåg.

  • Parametrar är inte Windows PowerShell, men gränssnittet bevarar som standard case. Argumentens fallkänslighet beror på cmdletens funktion. Argument skickas till en parameter som anges på kommandoraden.

  • Exempel på andra parameterdeklarationer finns i Cmdlet-parametrar.

Deklarera parametrar som positionella eller namngivna

En cmdlet måste ange varje parameter som antingen en positionell eller namngiven parameter. Båda typerna av parametrar accepterar enskilda argument, flera argument avgränsade med kommatecken och booleska inställningar. En boolesk parameter, som även kallas switch, hanterar endast booleska inställningar. Växeln används för att fastställa förekomsten av parametern. Den rekommenderade standardinställningen är false .

Get-ProcExempel-cmdleten definierar Name parametern som en positionsparameter med position 0. Det innebär att det första argumentet som användaren anger på kommandoraden infogas automatiskt för den här parametern. Om du vill definiera en namngiven parameter, där användaren måste ange parameternamnet från kommandoraden, lämnar du nyckelordet Position utanför attributdeklarationen.

Anteckning

Såvida parametrarna inte måste namnges rekommenderar vi att du placerar de mest använda parametrarna så att användarna inte behöver ange parameternamnet.

Deklarera parametrar som obligatoriska eller valfria

En cmdlet måste ange varje parameter som en valfri eller obligatorisk parameter. I Get-Proc exempel-cmdleten Name definieras parametern som valfri eftersom Mandatory nyckelordet inte har angetts i attributdeklarationen.

Stöd för parametervalidering

Exempel-cmdleten lägger till ett indatavalideringsattribut, Get-Proc System.Management.Automation.Validatenotnulloremptyattribute, till parametern för att aktivera validering av att indata varken är eller Name null är tomma. Det här attributet är ett av flera valideringsattribut som tillhandahålls av Windows PowerShell. Exempel på andra valideringsattribut finns i Verifiera parameterindata.

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

Åsidosätta en metod för indatabearbetning

Om din cmdlet ska hantera kommandoradsindata måste den åsidosätta lämpliga metoder för bearbetning av indata. De grundläggande indatabearbetningsmetoderna introduceras i Skapa din första cmdlet.

Get-ProcCmdleten åsidosätter metoden System.Management.Automation.Cmdlet.ProcessRecord för att hantera de parameterindata som tillhandahålls av Name användaren eller ett skript. Den här metoden hämtar processerna för varje begärt processnamn eller alla för processer om inget namn har angetts. Observera att i System.Management.Automation.Cmdlet.ProcessRecordär anropet till System.Management.Automation.Cmdlet.WriteObject%28System.Object%2CSystem.Boolean%29 utdatamekanismen för att skicka utdataobjekt till pipelinen. Den andra parametern i det här anropet, , är inställd på för att informera Windows PowerShell-körningen om att räkna upp utdatamatrisen med processobjekt och skriva en process i taget till enumerateCollection true kommandoraden.

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

Kodexempel

Den fullständiga C#-exempelkoden finns i GetProcessSample02 Sample.

Definiera objekttyper och formatering

Windows PowerShell skickar information mellan cmdlets med hjälp av .NET Framework objekt. Därför kan en cmdlet behöva definiera sin egen typ, eller så kan en cmdlet behöva utöka en befintlig typ som tillhandahålls av en annan cmdlet. Mer information om hur du definierar nya typer eller utökar befintliga typer finns i Utöka objekttyper och formatering.

Skapa cmdleten

När du har implementerat en cmdlet måste du registrera den med Windows PowerShell med hjälp av Windows PowerShell snapin-modulen. Mer information om hur du registrerar cmdlets finns i Registrera cmdlets, providers och värdprogram.

Testa cmdleten

När din cmdlet har registrerats Windows PowerShell kan du testa den genom att köra den på kommandoraden. Här är två sätt att testa koden för exempel-cmdleten. Mer information om hur du använder cmdlets från kommandoraden finns i Komma igång med Windows PowerShell.

  • I kommandotolken Windows PowerShell du följande kommando för att lista Internet Explorer process, som heter "IEXPLORE".

    get-proc -name iexplore
    

    Följande utdata visas.

    Handles  NPM(K)  PM(K)   WS(K)  VS(M)  CPU(s)   Id   ProcessName
    -------  ------  -----   -----  -----   ------ --   -----------
        354      11  10036   18992    85   0.67   3284   iexplore
    
  • Om du vill Internet Explorer, Outlook och Anteckningar processer med namnet "IEXPLORE", "OUTLOOK" och "ANTECKNINGAR" använder du följande kommando. Om det finns flera processer visas alla.

    get-proc -name iexplore, outlook, notepad
    

    Följande utdata visas.

    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
    

Se även

Lägga till parametrar som bearbetar pipelineindata

Skapa din första cmdlet

Utöka objekttyper och formatering

Registrera cmdlets, providers och värdprogram

Windows PowerShell-referens

Cmdlet-exempel