Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Eine Eingabequelle für ein Cmdlet ist ein Objekt in der Pipeline, das aus einem Upstream-Cmdlet stammt. In diesem Abschnitt wird beschrieben, wie Sie dem Cmdlet Get-Proc (beschrieben in Creating Your First Cmdlet) einen Parameter hinzufügen, damit das Cmdlet Pipelineobjekte verarbeiten kann.
Dieses Get-Proc Cmdlet verwendet einen Name Parameter, der Eingaben von einem Pipelineobjekt akzeptiert, Prozessinformationen vom lokalen Computer basierend auf den angegebenen Namen abruft und dann Informationen zu den Prozessen an der Befehlszeile anzeigt.
Definieren der Cmdlet-Klasse
Der erste Schritt beim Erstellen von Cmdlets ist immer das Benennen des Cmdlets und das Deklarieren der .NET-Klasse, die das Cmdlet implementiert. Dieses Cmdlet ruft Prozessinformationen ab, sodass der hier ausgewählte Verbname "Get" lautet. (Fast jede Art von Cmdlet, das Informationen abrufen kann, kann Befehlszeileneingaben verarbeiten.) Weitere Informationen zu genehmigten Cmdlet-Verben finden Sie unter Cmdlet Verb Names.
Es folgt die Definition für dieses Get-Proc-Cmdlet. Details zu dieser Definition werden in Creating Your First Cmdletangegeben.
[Cmdlet(VerbsCommon.Get, "proc")]
public class GetProcCommand : Cmdlet
<Cmdlet(VerbsCommon.Get, "Proc")> _
Public Class GetProcCommand
Inherits Cmdlet
Definieren von Eingaben aus der Pipeline
In diesem Abschnitt wird beschrieben, wie Sie Eingaben aus der Pipeline für ein Cmdlet definieren. Dieses Get-Proc-Cmdlet definiert eine Eigenschaft, die den Name Parameter darstellt, wie in Hinzufügen von Parametern, die die Befehlszeileneingabe verarbeiten,beschrieben.
(Allgemeine Informationen zum Deklarieren von Parametern finden Sie in diesem Thema.)
Wenn ein Cmdlet jedoch pipelineeingaben verarbeiten muss, muss es seine Parameter an Eingabewerte durch die Windows PowerShell-Laufzeit gebunden haben. Hierzu müssen Sie das schlüsselwort ValueFromPipeline hinzufügen oder das ValueFromPipelineByProperty Schlüsselwort zur System.Management.Automation.ParameterAttribute Attributdeklaration hinzufügen. Geben Sie das schlüsselwort ValueFromPipeline an, wenn das Cmdlet auf das vollständige Eingabeobjekt zugreift. Geben Sie die ValueFromPipelineByProperty an, wenn das Cmdlet nur auf eine Eigenschaft des Objekts zugreift.
Dies ist die Parameterdeklaration für den Name-Parameter dieses Get-Proc Cmdlets, das Pipelineeingaben akzeptiert.
[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
Die vorherige Deklaration legt das schlüsselwort ValueFromPipeline auf true fest, sodass die Windows PowerShell-Laufzeit den Parameter an das eingehende Objekt bindet, wenn das Objekt derselbe Typ wie der Parameter ist oder wenn es mit demselben Typ umgewandelt werden kann. Das schlüsselwort ValueFromPipelineByPropertyName ist auch auf true festgelegt, sodass die Windows PowerShell-Runtime das eingehende Objekt auf eine Name-Eigenschaft überprüft. Wenn das eingehende Objekt eine solche Eigenschaft aufweist, bindet die Laufzeit den Name Parameter an die Name Eigenschaft des eingehenden Objekts.
Hinweis
Die Einstellung des ValueFromPipeline Attributschlüsselworts für einen Parameter hat Vorrang vor der Einstellung für das schlüsselwort ValueFromPipelineByPropertyName.
Überschreiben einer Eingabeverarbeitungsmethode
Wenn Ihr Cmdlet die Pipelineeingabe verarbeitet, muss es die entsprechenden Eingabeverarbeitungsmethoden überschreiben. Die grundlegenden Eingabeverarbeitungsmethoden werden in Creating Your First Cmdleteingeführt.
Mit diesem Get-Proc cmdlet wird die System.Management.Automation.Cmdlet.ProcessRecord Methode außer Kraft gesetzt, um die vom Benutzer oder einem Skript bereitgestellte Name Parametereingabe zu verarbeiten. Diese Methode ruft die Prozesse für jeden angeforderten Prozessnamen oder alle Prozesse ab, wenn kein Name angegeben wird. Beachten Sie, dass in System.Management.Automation.Cmdlet.ProcessRecordder Aufruf von WriteObject(System.Object,System.Boolean) der Ausgabemechanismus zum Senden von Ausgabeobjekten an die Pipeline ist. Der zweite Parameter dieses Aufrufs, enumerateCollection, ist auf true festgelegt, um die Windows PowerShell-Runtime anweisen, das Array von Prozessobjekten aufgezählt und einen Prozess gleichzeitig in die Befehlszeile zu schreiben.
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
Codebeispiel
Den vollständigen C#-Beispielcode finden Sie unter GetProcessSample03 Sample.
Definieren von Objekttypen und Formatierungen
Windows PowerShell übergibt Informationen zwischen Cmdlets mithilfe von .NET-Objekten. Daher muss ein Cmdlet möglicherweise einen eigenen Typ definieren, oder das Cmdlet muss einen vorhandenen Typ erweitern, der von einem anderen Cmdlet bereitgestellt wird. Weitere Informationen zum Definieren neuer Typen oder zum Erweitern vorhandener Typen finden Sie unter Erweitern von Objekttypen und Formatierungen.
Erstellen des Cmdlets
Nach der Implementierung eines Cmdlets muss es über ein Windows PowerShell-Snap-In bei Windows PowerShell registriert werden. Weitere Informationen zum Registrieren von Cmdlets finden Sie unter Registrieren von Cmdlets, Anbietern und Hostanwendungen.
Testen des Cmdlets
Wenn Ihr Cmdlet bei Windows PowerShell registriert wurde, testen Sie es, indem Sie es in der Befehlszeile ausführen. Testen Sie beispielsweise den Code für das Beispiel-Cmdlet. Weitere Informationen zur Verwendung von Cmdlets über die Befehlszeile finden Sie in der Erste Schritte mit Windows PowerShell.
Geben Sie an der Windows PowerShell-Eingabeaufforderung die folgenden Befehle ein, um die Prozessnamen über die Pipeline abzurufen.
PS> type ProcessNames | Get-ProcDie folgende Ausgabe wird angezeigt.
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 OUTLOOKGeben Sie die folgenden Zeilen ein, um die Prozessobjekte abzurufen, die über eine
NameEigenschaft aus den Prozessen namens "IEXPLORE" verfügen. In diesem Beispiel wird das cmdletGet-Process(bereitgestellt von Windows PowerShell) als upstream-Befehl verwendet, um die "IEXPLORE"-Prozesse abzurufen.PS> Get-Process iexplore | Get-ProcDie folgende Ausgabe wird angezeigt.
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
Siehe auch
Hinzufügen von Parametern, die befehlszeileneingaben
Erstellen Ihres ersten Cmdlets
Erweitern von Objekttypen und Formatierungen