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
,OutVariable
ochOutBuffer
. Dessutom är följande alias för dessa parameternamn reserverade:vb
,db
,ea
,ev
,ov
ochob
.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
utöka objekttyper och formatering