Dela via


Lägga till parametrar som bearbetar kommandoradsindata

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

Definiera cmdlet-klassen

Det första steget i cmdlet-skapande är cmdlet-namngivning och deklarationen av .NET Framework-klassen som implementerar cmdleten. Den här cmdleten hämtar processinformation, så verbnamnet som väljs här är "Get". (Nästan alla typer av cmdletar 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 cmdleten Get-Proc. 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å pipelined-cmdletar och MemberType är en parameter för cmdleten Get-Member. Parametern har argumentet "egenskap".

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 Get-Proc är den enda parametern Name, som i det här fallet representerar namnet på det .NET Framework-processobjekt 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 parametern Name för cmdleten Get-Proc.

/// <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 du vill informera Windows PowerShell-körningen om att den här egenskapen är parametern Name läggs attributet System.Management.Automation.ParameterAttribute till i egenskapsdefinitionen. Den grundläggande syntaxen för att deklarera det här attributet är [Parameter()].

Anmärkning

En parameter måste uttryckligen markeras som offentlig. Parametrar som inte är markerade som offentliga standardvärden för interna och som inte hittas av Windows PowerShell-körningen.

Den här cmdleten använder en matris med strängar för parametern Name. Om möjligt bör cmdleten också definiera en parameter som en matris, eftersom detta gör att cmdleten kan acceptera mer ä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-cmdletar. Om till exempel alla cmdletar använder det fördefinierade Id parameternamnet för att identifiera en resurs, kommer användaren enkelt att förstå innebörden av parametern, oavsett vilken cmdlet de använder. I grund och botten följer parameternamn 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 följande parameternamn: WhatIf, Confirm, Verbose, Debug, Warn, ErrorAction, ErrorVariable, OutVariableoch OutBuffer. Dessutom är följande alias för dessa parameternamn reserverade: vb, db, ea, ev, ovoch ob.

  • Name är ett enkelt och vanligt parameternamn som rekommenderas för användning i dina cmdletar. 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år att komma ihåg.

  • Parametrar är skiftlägeskänsliga i Windows PowerShell, men som standard bevarar gränssnittet skiftläge. Argumentens skiftlägeskänslighet beror på hur cmdleten fungerar. 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 enkla argument, flera argument avgränsade med kommatecken och booleska inställningar. En boolesk parameter, även kallad 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.

Exempel-Get-Proc-cmdleten definierar parametern Name 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, för vilken användaren måste ange parameternamnet från kommandoraden, lämnar du nyckelordet Position i attributdeklarationen.

Anmärkning

Såvida inte parametrar måste namnges rekommenderar vi att du gör de mest använda parametrarna positionella så att användarna inte behöver skriva parameternamnet.

Deklarera parametrar som obligatoriska eller valfria

En cmdlet måste ange varje parameter som antingen en valfri eller obligatorisk parameter. I exemplet Get-Proc cmdlet definieras parametern Name som valfri eftersom nyckelordet Mandatory inte anges i attributdeklarationen.

Verifiering av stödparameter

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

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

Åsidosätta en indatabearbetningsmetod

Om cmdleten ska hantera kommandoradsindata måste den åsidosätta lämpliga metoder för indatabearbetning. De grundläggande metoderna för indatabearbetning introduceras i Skapa din första cmdlet.

Cmdleten Get-Proc åsidosätter metoden System.Management.Automation.Cmdlet.ProcessRecord för att hantera Name parameterindata som tillhandahålls av 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 anges. Observera att i System.Management.Automation.Cmdlet.ProcessRecordär anropet till System.Management.Automation.Cmdlet.WriteObject utdatamekanismen för att skicka utdataobjekt till pipelinen. Den andra parametern för det här anropet, enumerateCollection, är inställd på true för att informera Windows PowerShell-körningen om att räkna upp utdatamatrisen för processobjekt och skriva en process i taget till 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 cmdletar 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 en Windows PowerShell-snapin-modul. Mer information om hur du registrerar cmdletar finns i Så här registrerar du cmdletar, leverantörer och värdprogram.

Testa cmdleten

När din cmdlet har registrerats med 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 cmdletar från kommandoraden finns i Komma igång med Windows PowerShell.

  • I Windows PowerShell-prompten använder du följande kommando för att visa en lista över Internet Explorer-processen med namnet "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 visa en lista över 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 cmdletar, leverantörer och värdprogram

Windows PowerShell-referens

Cmdlet-exempel