Skapa en cmdlet utan parametrar

I det här avsnittet beskrivs hur du skapar en cmdlet som hämtar information från den lokala datorn utan att använda parametrar och sedan skriver informationen till pipelinen. Cmdleten som beskrivs här är en Get-Proc-cmdlet som hämtar information om processer på den lokala datorn och sedan visar informationen på kommandoraden.

Anteckning

Tänk på att när du skriver cmdlets laddas Windows PowerShell®-referenssammansättningar ned till disk (som standard på C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0). De är inte installerade i den globala sammansättningscachen (GAC).

Namnge cmdleten

Ett cmdlet-namn består av ett verb som anger åtgärden som cmdleten tar och ett substantiv som anger de objekt som cmdleten agerar på. Eftersom det här Get-Proc-cmdleten hämtar processobjekt använder den verbet "Get" som definieras av System.Management.Automation.Verbscommon-uppräkningen och substantivet "Proc" för att indikera att cmdleten fungerar på processobjekt.

När du namnger cmdlets ska du inte använda något av följande tecken: # , {} () [] & - /\ $ ; : " <> | ? @ ` .

Välja ett substantiv

Du bör välja ett substantiv som är specifikt. Det är bäst att använda ett enda substantiv med prefixet en förkortad version av produktnamnet. Ett exempel på ett cmdlet-namn av den här typen är " Get-SQLServer ".

Välja ett verb

Du bör använda ett verb från uppsättningen godkända cmdlet-verbnamn. Mer information om godkända cmdlet-verb finns i Cmdlet verbnamn.

Definiera cmdlet-klassen

När du har valt ett cmdlet-namn definierar du en .NET-klass för att implementera cmdleten. Här är klassdefinitionen för det här Get-Proc cmdlet:

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

Observera att tidigare i klassdefinitionen används attributet System.Management.Automation.CmdletAttribute med syntaxen för att identifiera den här klassen som [Cmdlet(verb, noun, ...)] en cmdlet. Detta är det enda obligatoriska attributet för alla cmdlets och det gör att Windows PowerShell kan anropa dem korrekt. Du kan ange attributnyckelord för att ytterligare deklarera klassen om det behövs. Tänk på att attributdeklarationen för vår GetProcCommand-exempelklass deklarerar endast substantiv- och verbnamnen för Get-Proc cmdleten.

Anteckning

För alla Windows PowerShell-attributklasser motsvarar de nyckelord som du kan ange egenskaper för attributklassen.

När du namnger -klassen för cmdleten är det en bra idé att återspegla cmdlet-namnet i klassnamnet. Det gör du genom att använda formuläret "VerbNounCommand" och ersätta "Verb" och "Substantiv" med verbet och substantivet som används i cmdlet-namnet. Som du ser i den tidigare klassdefinitionen definierar Get-Proc-cmdleten en klass med namnet GetProcCommand, som härleds från basklassen System.Management.Automation.Cmdlet.

Viktigt

Om du vill definiera en cmdlet som har direkt åtkomst till Windows PowerShell-körningen ska .NET-klassen härledas från basklassen System.Management.Automation.PSCmdlet. Mer information om den här klassen finns i Skapa en cmdlet som definierar parameteruppsättningar.

Anteckning

Klassen för en cmdlet måste uttryckligen markeras som offentlig. Klasser som inte har markerats som offentliga kommer som standard att vara interna och kan inte hittas Windows PowerShell körningen.

Windows PowerShell använder namnområdet Microsoft.PowerShell.Commands som cmdlet-klasser. Vi rekommenderar att du placerar cmdlet-klasserna i ett kommandonamnområde för DITT API-namnområde, till exempel xxx.PS.Commands.

Åsidosätta en metod för indatabearbetning

Klassen System.Management.Automation.Cmdlet innehåller tre huvudsakliga metoder för bearbetning av indata, varav minst en måste åsidosättas av din cmdlet. Mer information om hur Windows PowerShell bearbetar poster finns i How Windows PowerShell Works.

För alla typer av indata anropar Windows PowerShell System.Management.Automation.Cmdlet.BeginProcessing för att aktivera bearbetning. Om cmdleten måste utföra viss förbearbetning eller konfiguration kan den göra detta genom att åsidosätta den här metoden.

Anteckning

Windows PowerShell använder termen "record" för att beskriva den uppsättning parametervärden som anges när en cmdlet anropas.

Om din cmdlet accepterar pipelineindata måste den åsidosätta metoden System.Management.Automation.Cmdlet.ProcessRecord och eventuellt metoden System.Management.Automation.Cmdlet.EndProcessing. En cmdlet kan till exempel åsidosätta båda metoderna om den samlar in alla indata med hjälp av System.Management.Automation.Cmdlet.ProcessRecord och sedan fungerar på indata som helhet i stället för ett element i taget, vilket Sort-Object cmdleten gör.

Om cmdleten inte tar pipelineindata bör den åsidosätta metoden System.Management.Automation.Cmdlet.EndProcessing. Tänk på att den här metoden ofta används i stället för System.Management.Automation.Cmdlet.BeginProcessing när cmdleten inte kan användas på ett element i taget, vilket är fallet för en sorterings-cmdlet.

Eftersom den här Get-Proc-cmdleten måste ta emot pipelineindata åsidosätter den metoden System.Management.Automation.Cmdlet.ProcessRecord och använder standardimplementeringarna för System.Management.Automation.Cmdlet.BeginProcessing och System.Management.Automation.Cmdlet.EndProcessing. Åsidosättningen System.Management.Automation.Cmdlet.ProcessRecord hämtar processer och skriver dem till kommandoraden med hjälp av metoden System.Management.Automation.Cmdlet.WriteObject.

protected override void ProcessRecord()
{
  // Get the current processes
  Process[] processes = Process.GetProcesses();

  // Write the processes to the pipeline making them available
  // to the next cmdlet. The second parameter of this call tells
  // PowerShell to enumerate the array, and send one process at a
  // time to the pipeline.
  WriteObject(processes, true);
}
Protected Overrides Sub ProcessRecord()

    '/ Get the current processes.
    Dim processes As Process()
    processes = Process.GetProcesses()

    '/ Write the processes to the pipeline making them available
    '/ to the next cmdlet. The second parameter of this call tells
    '/ PowerShell to enumerate the array, and send one process at a
    '/ time to the pipeline.
    WriteObject(processes, True)

End Sub 'ProcessRecord

Saker att komma ihåg om indatabearbetning

  • Standardkällan för indata är ett explicit objekt (till exempel en sträng) som tillhandahålls av användaren på kommandoraden. Mer information finns i Skapa en cmdlet för att bearbeta kommandoradsinmatning.

  • En indatabearbetningsmetod kan också ta emot indata från utdataobjektet för en överordnad cmdlet i pipelinen. Mer information finns i Skapa en cmdlet för att bearbeta pipelineindata. Tänk på att din cmdlet kan ta emot indata från en kombination av kommandorads- och pipelinekällor.

  • Den underordnade cmdleten kanske inte returneras under en längre tid eller inte alls. Därför bör metoden för indatabearbetning i cmdleten inte innehålla lås under anrop till System.Management.Automation.Cmdlet.WriteObject, särskilt lås för vilka omfånget sträcker sig utanför cmdlet-instansen.

Viktigt

Cmdlets bör aldrig anropa System.Console.Writeline* eller motsvarande.

Till exempel kanske System.Management.Automation.Cmdlet.EndProcessing inte anropas om cmdleten avbryts mitt i tiden eller om ett avslutande fel inträffar i någon del av cmdleten. Därför bör en cmdlet som kräver objektrensning implementera det fullständiga mönstret System.I Automatosable, inklusive slutföraren, så att körningen kan anropa både System.Management.Automation.Cmdlet.EndProcessing och System.I Automatosable.Dispose* i slutet av bearbetningen.

Kodexempel

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

Definiera objekttyper och formatering

Windows PowerShell skickar information mellan cmdlets med hjälp av .NET-objekt. Därför kan en cmdlet behöva definiera sin egen typ, eller så kan cmdleten 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 Windows PowerShell via en Windows PowerShell snapin-modulen. Mer information om hur du registrerar cmdlets finns i How to Register Cmdlets, Providers, and Host Applications.

Testa cmdleten

När din cmdlet har registrerats med Windows PowerShell kan du testa den genom att köra den på kommandoraden. Koden för vår Get-Proc cmdlet är liten, men den använder fortfarande Windows PowerShell och ett befintligt .NET-objekt, vilket är tillräckligt för att göra det användbart. Vi testar det för att bättre förstå vad Get-Proc kan göra och hur dess utdata kan användas. Mer information om hur du använder cmdlets från kommandoraden finns i Komma igång med Windows PowerShell.

  1. Starta Windows PowerShell och kör de aktuella processerna på datorn.

    get-proc
    

    Följande utdata visas.

    Handles  NPM(K)  PM(K)  WS(K)  VS(M)  CPU(s)  Id   ProcessName
    -------  ------  -----  -----  -----  ------  --   ----------
    254      7       7664   12048  66     173.75  1200  QCTRAY
    32       2       1372   2628   31       0.04  1860  DLG
    271      6       1216   3688   33       0.03  3816  lg
    27       2       560    1920   24       0.01  1768  TpScrex
    ...
    
  2. Tilldela en variabel till cmdlet-resultatet för enklare manipulering.

    $p=get-proc
    
  3. Hämta antalet processer.

    $p.length
    

    Följande utdata visas.

    63
    
  4. Hämta en specifik process.

    $p[6]
    

    Följande utdata visas.

    Handles  NPM(K)  PM(K)  WS(K)  VS(M)  CPU(s)  Id    ProcessName
    -------  ------  -----  -----  -----  ------  --    -----------
    1033     3       2400   3336   35     0.53    1588  rundll32
    
  5. Hämta starttiden för den här processen.

    $p[6].starttime
    

    Följande utdata visas.

    Tuesday, July 26, 2005 9:34:15 AM
    
    $p[6].starttime.dayofyear
    
    207
    
  6. Hämta de processer för vilka referensantalet är större än 500 och sortera resultatet.

    $p | Where-Object {$_.HandleCount -gt 500 } | Sort-Object HandleCount
    

    Följande utdata visas.

    Handles  NPM(K)  PM(K)  WS(K)  VS(M)  CPU(s)  Id   ProcessName
    -------  ------  -----  -----  -----  ------  --   ----------
    568      14      2164   4972   39     5.55    824  svchost
    716       7      2080   5332   28    25.38    468  csrss
    761      21      33060  56608  440  393.56    3300 WINWORD
    791      71      7412   4540   59     3.31    492  winlogon
    ...
    
  7. Använd Get-Member cmdleten för att visa en lista över de egenskaper som är tillgängliga för varje process.

    $p | Get-Member -MemberType property
    
        TypeName: System.Diagnostics.Process
    

    Följande utdata visas.

    Name                     MemberType Definition
    ----                     ---------- ----------
    BasePriority             Property   System.Int32 BasePriority {get;}
    Container                Property   System.ComponentModel.IContainer Conta...
    EnableRaisingEvents      Property   System.Boolean EnableRaisingEvents {ge...
    ...
    

Se även

Skapa en cmdlet för att bearbeta kommandoradsinmatning

Skapa en cmdlet för att bearbeta pipelineindata

Skapa en Windows PowerShell cmdlet

Utöka objekttyper och formatering

Så Windows PowerShell fungerar

Registrera cmdlets, providers och värdprogram

Windows PowerShell-referens

Cmdlet-exempel