Parameters toevoegen die pijplijninvoer verwerken
Een invoerbron voor een cmdlet is een object in de pijplijn dat afkomstig is van een upstream-cmdlet. In deze sectie wordt beschreven hoe u een parameter toevoegt aan de Get-Proc-cmdlet (beschreven in Uw eerste cmdlet maken) zodat de cmdletpijplijnobjecten kan verwerken.
Deze Get-Proc cmdlet maakt gebruik van een parameter die invoer van een pijplijnobject accepteert, procesgegevens op haalt van de lokale computer op basis van de opgegeven namen en vervolgens informatie over de processen op de opdrachtregel we Name
weergegeven.
De cmdlet-klasse definiëren
De eerste stap bij het maken van de cmdlet is het altijd benoemen van de cmdlet en het declareren van de .NET-klasse die de cmdlet implementeert. Met deze cmdlet worden procesgegevens opgehaald, dus de hier gekozen werkwoordnaam is 'Get'. (Bijna elk soort cmdlet waarmee informatie kan worden opgehaald, kan opdrachtregelinvoer verwerken.) Zie cmdlet werkwoordnamen voor meer informatie over goedgekeurde cmdlet-woorden.
Hier volgt de definitie voor deze Get-Proc cmdlet. Details van deze definitie worden gegeven in Uw eerste cmdlet maken.
[Cmdlet(VerbsCommon.Get, "proc")]
public class GetProcCommand : Cmdlet
<Cmdlet(VerbsCommon.Get, "Proc")> _
Public Class GetProcCommand
Inherits Cmdlet
Invoer definiëren vanuit de pijplijn
In deze sectie wordt beschreven hoe u invoer van de pijplijn voor een cmdlet definieert. Deze Get-Proc cmdlet definieert een eigenschap die de parameter vertegenwoordigt, zoals beschreven in Parameters toevoegen Name
die opdrachtregelinvoer verwerken.
(Zie dit onderwerp voor algemene informatie over het declareren van parameters.)
Wanneer een cmdlet pijplijninvoer moet verwerken, moeten de parameters echter zijn gebonden aan invoerwaarden door de Windows PowerShell runtime. Hiervoor moet u het trefwoord toevoegen of het trefwoord toevoegen aan de ValueFromPipeline
ValueFromPipelineByProperty
kenmerkdeclaratie System.Management.Automation.Parameterattribute. Geef het ValueFromPipeline
trefwoord op als de cmdlet toegang heeft tot het volledige invoerobject. Geef op ValueFromPipelineByProperty
of de cmdlet alleen toegang heeft tot een eigenschap van het object.
Hier is de parameterdeclaratie voor Name
de parameter van Get-Proc cmdlet die pijplijninvoer accepteert.
[Parameter(
Position = 0,
ValueFromPipeline = true,
ValueFromPipelineByPropertyName = true)]
[ValidateNotNullOrEmpty]
public string[] Name
{
get { return this.processNames; }
set { this.processNames = value; }
}
<Parameter(Position:=0, ValueFromPipeline:=True, _
ValueFromPipelineByPropertyName:=True), ValidateNotNullOrEmpty()> _
Public Property Name() As String()
Get
Return processNames
End Get
Set(ByVal value As String())
processNames = value
End Set
End Property
Met de vorige declaratie wordt het trefwoord zo dat ValueFromPipeline
de Windows PowerShell-runtime de parameter verbindt met het binnenkomende object als het object hetzelfde type is als de parameter, of als het kan worden geseed tot true
hetzelfde type. Het ValueFromPipelineByPropertyName
trefwoord is ook ingesteld true
op zodat de Windows PowerShell runtime het binnenkomende object op een eigenschap Name
controleert. Als het binnenkomende object een dergelijke eigenschap heeft, verbindt de runtime de Name
parameter met de eigenschap van het Name
binnenkomende object.
Notitie
De instelling van het ValueFromPipeline
trefwoord kenmerk voor een parameter heeft voorrang op de instelling voor het ValueFromPipelineByPropertyName
trefwoord.
Een invoerverwerkingsmethode overschrijven
Als uw cmdlet pijplijninvoer moet verwerken, moet deze de juiste invoerverwerkingsmethoden overschrijven. De basismethoden voor invoerverwerking zijn geïntroduceerd in Uw eerste cmdlet maken.
Met Get-Proc cmdlet wordt de methode System.Management.Automation.Cmdlet.ProcessRecord overgeslagen om de parameterinvoer van de gebruiker of een Name
script te verwerken. Met deze methode worden de processen voor elke aangevraagde procesnaam of alle processen opgevraagd als er geen naam is opgegeven. U ziet dat in System.Management.Automation.Cmdlet.ProcessRecordde aanroep van WriteObject(System.Object,System.Boolean) het uitvoermechanisme is voor het verzenden van uitvoerobjecten naar de pijplijn. De tweede parameter van deze aanroep, , is zo ingesteld dat de enumerateCollection
Windows PowerShell-runtime de matrix met procesobjecten moet opsnoemen en één proces tegelijk naar de opdrachtregel moet true
schrijven.
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);
} // End foreach (string name...).
}
}
Protected Overrides Sub ProcessRecord()
Dim processes As Process()
'/ If no process names are passed to the cmdlet, get all processes.
If processNames Is Nothing Then
processes = Process.GetProcesses()
Else
'/ 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 If
End Sub 'ProcessRecord
Codevoorbeeld
Zie GetProcessSample03 Samplevoor de volledige C#-voorbeeldcode.
Objecttypen en opmaak definiëren
Windows PowerShell geeft informatie tussen cmdlets door met behulp van .Net-objecten. Daarom moet een cmdlet mogelijk een eigen type definiëren, of moet de cmdlet mogelijk een bestaand type uitbreiden dat wordt geleverd door een andere cmdlet. Zie Extending Object Types and Formatting (Objecttypen uitbreiden en formatteren) voor meer informatie over het definiëren van nieuwe typen of het uitbreiden van bestaande typen.
De cmdlet bouwen
Na het implementeren van een cmdlet moet deze worden geregistreerd bij Windows PowerShell via Windows PowerShell-module. Zie How to Register Cmdlets, Providers, and Host Applications (Cmdlets,providers en hosttoepassingen registreren) voor meer informatie over het registreren van cmdlets.
De cmdlet testen
Wanneer uw cmdlet is geregistreerd bij Windows PowerShell test u deze door deze uit te voeren op de opdrachtregel. Test bijvoorbeeld de code voor de voorbeeld-cmdlet. Zie voor meer informatie over het gebruik van cmdlets vanaf de opdrachtregel de Aan de slag met Windows PowerShell.
Voer bij Windows PowerShell opdrachtprompt de volgende opdrachten in om de procesnamen via de pijplijn op te halen.
PS> type ProcessNames | get-proc
De volgende uitvoer wordt weergegeven.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 809 21 40856 4448 147 9.50 2288 iexplore 737 21 26036 16348 144 22.03 3860 iexplore 39 2 1024 388 30 0.08 3396 notepad 3927 62 71836 26984 467 195.19 1848 OUTLOOK
Voer de volgende regels in om de procesobjecten op te halen die een eigenschap
Name
hebben van de processen met de naam 'IEXPLORE'. In dit voorbeeld wordt de cmdlet (geleverd door Windows PowerShell) gebruikt als een upstream-opdracht om deGet-Process
IEXPLORE-processen op te halen.PS> get-process iexplore | get-proc
De volgende uitvoer wordt weergegeven.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 801 21 40720 6544 142 9.52 2288 iexplore 726 21 25872 16652 138 22.09 3860 iexplore 801 21 40720 6544 142 9.52 2288 iexplore 726 21 25872 16652 138 22.09 3860 iexplore
Zie ook
Parameters toevoegen die opdrachtregelinvoer verwerken
Objecttypen en -opmaak uitbreiden
Cmdlets, providers en hosttoepassingen registreren