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
ochVerbose
Debug
Warn
ErrorAction
ErrorVariable
OutVariable
OutBuffer
. Dessutom är följande alias för dessa parameternamn reserverade:vb
, , , , ochdb
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-Proc
Exempel-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-Proc
Cmdleten å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
Utöka objekttyper och formatering
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