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.
- Din cmdlet kan ha objektvariabler för att rensa när bearbetningen är klar (till exempel om den öppnar en filhanterare i metoden System.Management.Automation.Cmdlet.BeginProcessing och håller referensen öppen för användning av System.Management.Automation.Cmdlet.ProcessRecord). Det är viktigt att komma ihåg att Windows PowerShell-körningen inte alltid anropar metoden System.Management.Automation.Cmdlet.EndProcessing, som ska utföra objektrensning.
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.
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 ...
Tilldela en variabel till cmdlet-resultatet för enklare manipulering.
$p=get-proc
Hämta antalet processer.
$p.length
Följande utdata visas.
63
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
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
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 ...
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
Feedback
https://aka.ms/ContentUserFeedback.
Kommer snart: Under hela 2024 kommer vi att fasa ut GitHub-problem som feedbackmekanism för innehåll och ersätta det med ett nytt feedbacksystem. Mer information finns i:Skicka och visa feedback för