Dela via


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 den informationen på kommandoraden.

Anmärkning

Tänk på att när du skriver cmdletar laddas Windows PowerShell-referenssammansättningarna® ned till disken (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 vilken åtgärd cmdleten tar och ett substantiv som anger de objekt som cmdleten agerar på. Eftersom det här exemplet Get-Proc cmdlet hämtar processobjekt använder det verbet "Get", som definieras av System.Management.Automation.VerbsCommon uppräkning och substantivet "Proc" för att indikera att cmdleten fungerar på processobjekt.

När du namnger cmdletar 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 unikt substantiv prefix med en förkortad version av produktnamnet. Ett exempel på cmdletnamnet för den här typen är "Get-SQLServer".

Välja ett verb

Du bör använda ett verb från uppsättningen med godkända cmdlet-verbnamn. Mer information om de godkända cmdlet-verben 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 exemplet Get-Proc cmdlet:

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

Observera att tidigare än klassdefinitionen används attributet System.Management.Automation.CmdletAttribute, med syntaxen [Cmdlet(verb, noun, ...)], för att identifiera den här klassen som en cmdlet. Det här är det enda obligatoriska attributet för alla cmdletar och gör att Windows PowerShell-körningen 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 endast deklarerar substantiv- och verbnamnen för cmdleten Get-Proc.

Anmärkning

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 cmdletens namn. Som visas i föregående klassdefinition definierar exempel-cmdleten Get-Proc en klass med namnet GetProcCommand, som härleds från System.Management.Automation.Cmdlet basklass.

Viktigt!

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

Anmärkning

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

Windows PowerShell använder Microsoft.PowerShell.Commands namnrymd för sina cmdlet-klasser. Vi rekommenderar att du placerar dina cmdlet-klasser i ett kommandonamnområde i ditt API-namnområde, till exempel xxx.PS. Kommandon.

Åsidosätta en indatabearbetningsmetod

Klassen System.Management.Automation.Cmdlet innehåller tre huvudsakliga indatabearbetningsmetoder, varav minst en måste åsidosättas av cmdleten. Mer information om hur Windows PowerShell bearbetar poster finns i Hur Windows PowerShell fungerar.

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

Anmärkning

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

Om cmdleten 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, som cmdleten Sort-Object 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 köras på ett element i taget, vilket är fallet för en sorterings-cmdlet.

Eftersom det här exemplet Get-Proc cmdlet 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. System.Management.Automation.Cmdlet.ProcessRecord åsidosätter hämtar processer och skriver dem till kommandoraden med hjälp av metoden System.Management.Automation.Cmdlet.WriteObj ect.

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 kommandoradsindata.

  • En indatabearbetningsmetod kan också ta emot indata från utdataobjektet för en överordnad cmdlet på 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 indatabearbetningsmetoden i cmdleten inte innehålla lås under anrop till System.Management.Automation.Cmdlet.WriteObject, särskilt lås som omfånget sträcker sig utanför cmdlet-instansen.

Viktigt!

Cmdletar ska aldrig anropa System.Console.Writeline* eller motsvarande.

Till exempel kanske System.Management.Automation.Cmdlet.EndProcessing kanske inte anropas om cmdleten avbryts halvvägs 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 System.IDisposable- mönster, inklusive finalizern, så att körningen kan anropa både System.Management.Automation.Cmdlet.EndProcessing och System.IDisposable.Dispose* i slutet av bearbetningen.

Kodexempel

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

Definiera objekttyper och formatering

Windows PowerShell skickar information mellan cmdletar 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 med Windows PowerShell via 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. Koden för vårt exempel Get-Proc cmdlet är liten, men den använder fortfarande Windows PowerShell-körningen och ett befintligt .NET-objekt, vilket räcker 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 cmdletar från kommandoraden finns i Komma igång med Windows PowerShell.

  1. Starta Windows PowerShell och få de aktuella processerna att köras 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-resultaten 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 som referensantalet är större än 500 för 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 cmdleten Get-Member för att visa 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 kommandoradsindata

Skapa en cmdlet för att bearbeta pipelineindata

Skapa en Windows PowerShell-cmdlet

utöka objekttyper och formatering

Hur Windows PowerShell fungerar

Registrera cmdletar, leverantörer och värdprogram

Windows PowerShell-referens

Cmdlet-exempel