Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Een bron van invoer voor een cmdlet is een object in de pijplijn die 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 cmdlet pijplijnobjecten kan verwerken.
Deze Get-Proc cmdlet maakt gebruik van een Name parameter die invoer van een pijplijnobject accepteert, procesgegevens ophaalt van de lokale computer op basis van de opgegeven namen en vervolgens informatie weergeeft over de processen op de opdrachtregel.
De cmdlet-klasse definiëren
De eerste stap bij het maken van de cmdlet is altijd de naamgeving van de cmdlet en het declareren van de .NET-klasse die de cmdlet implementeert. Deze cmdlet haalt procesgegevens op, dus de werkwoordnaam die hier is gekozen, is 'Get'. (Bijna elk type cmdlet waarmee informatie kan worden opgehaald, kan opdrachtregelinvoer verwerken.) Zie Cmdlet Verb Namesvoor meer informatie over goedgekeurde cmdlet-werkwoorden.
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 definieert uit de pijplijn voor een cmdlet. Met deze Get-Proc cmdlet wordt een eigenschap gedefinieerd die de parameter Name vertegenwoordigt, zoals beschreven in Parameters toevoegen die opdrachtregelinvoer verwerken.
(Zie dit onderwerp voor algemene informatie over het declareren van parameters.)
Wanneer een cmdlet echter pijplijninvoer moet verwerken, moeten de parameters zijn gebonden aan invoerwaarden door de Windows PowerShell-runtime. Hiervoor moet u het ValueFromPipeline trefwoord toevoegen of het ValueFromPipelineByProperty trefwoord toevoegen aan de declaratie System.Management.Automation.ParameterAttribute. Geef het ValueFromPipeline trefwoord op als de cmdlet toegang heeft tot het volledige invoerobject. Geef de ValueFromPipelineByProperty op als de cmdlet alleen toegang heeft tot een eigenschap van het object.
Hier volgt de parameterdeclaratie voor de Name parameter van deze 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 ValueFromPipeline trefwoord ingesteld op true, zodat 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 verplicht tot hetzelfde type. Het trefwoord ValueFromPipelineByPropertyName is ook ingesteld op true, zodat de Windows PowerShell-runtime het binnenkomende object controleert op een Name eigenschap. Als het binnenkomende object een dergelijke eigenschap heeft, verbindt de runtime de parameter Name met de eigenschap Name van het binnenkomende object.
Notitie
De instelling van het ValueFromPipeline kenmerkwoord 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 worden geïntroduceerd in Uw eerste cmdlet maken.
Deze Get-Proc cmdlet overschrijft de methode System.Management.Automation.Cmdlet.ProcessRecord om de Name parameterinvoer van de gebruiker of een script af te handelen. 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 naar WriteObject(System.Object,System.Boolean) het uitvoermechanisme is voor het verzenden van uitvoerobjecten naar de pijplijn. De tweede parameter van deze aanroep, enumerateCollection, is ingesteld op true om de Windows PowerShell-runtime de matrix van procesobjecten te inventariseren en één proces tegelijk naar de opdrachtregel te 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 door tussen cmdlets 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 Objecttypen en Opmaak uitbreidenvoor meer informatie over het definiëren van nieuwe typen of het uitbreiden van bestaande typen.
De cmdlet bouwen
Nadat u een cmdlet hebt geïmplementeerd, moet deze zijn geregistreerd bij Windows PowerShell via een Windows PowerShell-module. Zie Cmdlets, providers en hosttoepassingen registrerenvoor 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 de Aan de slag met Windows PowerShellvoor meer informatie over het gebruik van cmdlets vanaf de opdrachtregel.
Voer bij de Windows PowerShell-prompt de volgende opdrachten in om de procesnamen via de pijplijn op te halen.
PS> type ProcessNames | Get-ProcDe 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 OUTLOOKVoer de volgende regels in om de procesobjecten met een
Nameeigenschap op te halen uit de processen met de naam IEXPLORE. In dit voorbeeld wordt deGet-Process-cmdlet (geleverd door Windows PowerShell) gebruikt als een upstream-opdracht om de 'IEXPLORE'-processen op te halen.PS> Get-Process iexplore | Get-ProcDe 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